代码之家  ›  专栏  ›  技术社区  ›  J Wynia

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

  •  9
  • J Wynia  · 技术社区  · 18 年前

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

    当我在我想使用的应用程序中使用亚音速对象时,这应该是合理的,我认为,通过根据数据类型包括不同的输出HTML,反射是实现这一点的方法。

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

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

    这很好,但由于亚音速生成的对象实际上充满了在Subsonic.dll等中定义的对象类型,因此不会加载这些依赖对象。输入:

    AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies();
    

    这也正是我所期望的。然而,我试图弄清楚的是如何加载这些程序集,以便我对对象的挖掘能够正常工作。我知道,如果这些程序集位于GAC或正在运行的可执行文件的目录中,我可以按它们的名称加载它们,但这不太可能是本用例的情况,这是我的主要用例。

    2 回复  |  直到 18 年前
        1
  •  13
  •   Tim Cooper    15 年前

    这里有几个选项:

    1. 使贴在 AppDomain.AssemblyResolve 再做一个 LoadFile 基于请求的程序集。
    2. 制造另一个 AppDomain 以目录为基础,并加载该目录中的程序集 .

    Assembly.ReflectionOnlyLoad ).

        2
  •  5
  •   mathume    8 年前

    我锻炼了 Kent Boogaart 第二种选择。 基本上,我必须:

    ResolveEventHandler 在单独的类中,从 MarshalByRefObject 并添加 Serializable 属性

    2.)添加当前值 ApplicationBase AppDomain PrivateBinPath .

    github .