c# - 如何在 C# 中的运行时加载程序集及其所有依赖项以进行反射?

标签 c# .net reflection subsonic

我正在为自己编写一个实用程序,部分原因是作为学习 C# 反射的练习,部分原因是我实际上想要自己使用生成的工具。

我所要做的基本上是将应用程序指向一个程序集,并选择一个给定的类,从中选择应该作为字段包含在导出的 HTML 表单中的属性。然后,该表单将在我的 ASP.NET MVC 应用程序中用作 View 的开头。

因为我在我想使用的应用程序中使用 Subsonic 对象,这应该是合理的,我认为,通过根据数据类型包含不同的输出 HTML 等内容,反射是完成此操作的方法.

然而,我正在寻找的东西似乎难以捉摸。我正在尝试将通过 OpenFileDialog 选择的 DLL/EXE 作为起点并加载它:

String FilePath = Path.GetDirectoryName(FileName);
System.Reflection.Assembly o = System.Reflection.Assembly.LoadFile(FileName);

这很好用,但是因为 Subsonic 生成的对象实际上充满了在 Subsonic.dll 等中定义的对象类型,所以不会加载这些依赖对象。输入:

AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies();

这也包含了我所期望的内容。但是,我想弄清楚的是如何加载这些程序集,以便我深入研究我的对象时能够正常工作。我知道如果这些程序集位于 GAC 或正在运行的可执行文件的目录中,我可以按它们的名称加载它们,但对于这个用例来说情况不太可能是这样,这是我的主要用例。

因此,归结为我如何加载给定的程序集及其所有以文件名开头的任意程序集,并生成一个完全反射可浏览的类型、属性、方法等树。

我知道像 Reflector 这样的工具可以做到这一点,但我只是找不到实现它的语法。

最佳答案

这里有几个选项:

  1. 附加到 AppDomain.AssemblyResolve 并根据请求的程序集执行另一个 LoadFile
  2. 以该目录为基础启动另一个 AppDomain,并在该 AppDomain 中加载程序集。

我强烈建议采用选项 2,因为这可能会更干净并且允许您在之后卸载所有这些程序集。此外,如果您只需要反射它们,请考虑在仅反射上下文中加载程序集(请参阅 Assembly.ReflectionOnlyLoad)。

关于c# - 如何在 C# 中的运行时加载程序集及其所有依赖项以进行反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220/

相关文章:

c# - Xamarin.iOS NSUnknownKeyException 原因 : [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key staticDataSource

c# - Linq连接两个相同类型的对象

.net - WCF:我应该如何维护客户端和服务器中的契约(Contract)类?

c# - 从默认的 mvc 应用程序数据库中删除用户

c# - 反射以查找方法是否正在使用任何特定方法

c# - 使用 Android 手机浏览器从 Asp.net 网站下载 .apk 时出错

c# - 在另一个 IDisposable "using"语句中处理 IDisposables

c# - PropertyGrid 替代品

java - 使用反射查找 JNI 中的 Java 类是否为 Final

c# - Entity Framework DbSet 反射