在运行时以编程方式添加DLL

Mah*_*hsa 18 .net c# dll

使用C#,我在运行时创建一个DLL,现在我想在运行时将它添加为我的项目的引用.

我尝试使用该LoadFrom方法,但它不起作用.

我怎样才能做到这一点?

Ghy*_*hal 25

首先你应该加载DLL

Assembly assembly = Assembly.LoadFrom("dllPath");
Run Code Online (Sandbox Code Playgroud)

然后,您可能需要将程序集添加到应用程序域

AppDomain.CurrentDomain.Load(assembly.GetName());
Run Code Online (Sandbox Code Playgroud)

之后,您可以从此程序集加载任何类型

Type t = assembly.GetType("typeName");
Run Code Online (Sandbox Code Playgroud)

然后使用反射,您可以执行此类型的方法

请注意,您可能需要在配置文件中添加以下内容.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="dlls folder"/>
  </assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)


sti*_*net 8

LoadFile与LoadFrom

小心 - 这些不是一回事.

LoadFrom()通过Fusion,可以重定向到另一个路径,但是如果已经在LoadFrom上下文中加载了相同的身份,则可以使用相同的身份.LoadFile()根本没有通过Fusion绑定 - 加载器只是继续并正好加载*调用者请求的内容.它不使用Load或LoadFrom上下文.因此,LoadFrom()通常会为您提供所要求的内容,但不一定如此.LoadFile()适用于那些真正非常想要的人.(*但是,从v2开始,策略将应用于LoadFrom()和LoadFile(),因此LoadFile()不一定完全是请求的内容.另外,从v2开始,如果具有其标识的程序集在GAC,将使用GAC副本.使用ReflectionOnlyLoadFrom()来加载您想要的 - 但是,请注意,无法执行以这种方式加载的程序集.)

LoadFile()有一个catch.由于它不使用绑定上下文,因此不会在其目录中自动找到其依赖项.如果它们在Load上下文中不可用,则必须订阅AssemblyResolve事件才能绑定它们.

参考Suzanne Cook的.NET CLR笔记


dze*_*ras 4

使用Assembly.LoadFile方法,然后使用反射运行其中的代码。