即使在部署之后,也从其他文件夹引用dll

时间:2017-08-10 16:22:53

标签: c# .net winforms dll .net-assembly

如何引用应用程序文件夹外的dll并利用其方法和接口动态加载它?有没有办法做到这一点?

注意:即使在部署应用程序之后,也必须从该路径进行引用。

2 个答案:

答案 0 :(得分:1)

我会尝试使用Assembly.LoadFrom(string)。这种重载采用了组件的路径,并允许您通过反射来利用它。

您可以像这样获得程序集:

var sampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
var method = sampleAssembly.GetTypes()[0].GetMethod("Method1");

然后使用MethodInfo.Invoke()

调用该方法

答案 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上有一个例子。