如何引用应用程序文件夹外的dll并利用其方法和接口动态加载它?有没有办法做到这一点?
注意:即使在部署应用程序之后,也必须从该路径进行引用。
答案 0 :(得分:1)
我会尝试使用Assembly.LoadFrom(string)
。这种重载采用了组件的路径,并允许您通过反射来利用它。
您可以像这样获得程序集:
var sampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
var method = sampleAssembly.GetTypes()[0].GetMethod("Method1");
调用该方法
答案 1 :(得分:1)
有很多方法可以做到这一点。有关运行时如何定位程序集的详细说明,请参见How runtime locates assemblies。
您可以通过codeBase
中的app.config
元素指定确切位置:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="neutral" />
<codeBase version="2.0.0.0"
href="http://www.litwareinc.com/myAssembly.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
如果您的程序集位于应用程序的子文件夹中,那么您可以使用probing
元素:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
如果全部失败,您始终可以编写事件处理程序并将其附加到AppDomain.AssemblyResolve以显式加载程序集。 SO上有一个例子。