从另一个DLL引用DLL

Sac*_*ach 11 c# dll reference

我有一个C#应用程序,我们称之为App.exe.它引用了一个名为A.dll的DLL,后者又引用了另一个DLL,即B.dll.然而,它们被引用的方式有点不同.在A.dll的代码中,它直接引用了B.dll(通过转到Project> References> Add B.dll).但是我的App.exe有代码在运行时使用Assembly.Load()等加载A.dll.

所以回顾一下,

App.exe ----(运行时加载)---> A.dll ----(直接引用)---> B.dll

所有这三件事(App.exe,A.dll和B.dll)都在同一个目录中,比方说ExeDir.现在我想要做的是,将A.dll和B.dll放在ExeDir的子目录中.我可以通过使用指定A.dll路径的App.config文件并要求App.exe从该路径加载A.dll来完成此操作.到现在为止还挺好.

然而问题是,当我这样做时,.NET给我一个错误,说它无法找到与A.dll在同一目录中的B.dll.如果我将其移回原始目录(与App.exe相同的目录),那么它可以正常工作.这意味着,我可以将A.dll放在子目录中,但B.dll需要位于原始目录中.

有什么方法可以将两个DLL保存在子目录中?

D S*_*ley 10

<probing>在app.config中添加一个元素:

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)


M.B*_*ock 7

您可以B.DLL通过为AppDomain.AssemblyResolve当前AppDomain 的事件提供事件处理程序来手动解析程序集.

currentDomain.AssemblyResolve += ResolveLostAssemblies;
Run Code Online (Sandbox Code Playgroud)

然后提供一个实现ResolveEventHandler:

private Assembly ResolveLostAssemblies(object sender, ResolveEventArgs args)
{
    // Find the assembly referenced by args.Name, load it dynamically, and return it.
}
Run Code Online (Sandbox Code Playgroud)

我发现这可以最大程度地控制加载哪些程序集以及何时加载.它特别适用于您的应用程序是可插入的情况,并且每个插件都位于"plugins"文件夹(不一定是应用程序目录)的子目录中.从技术上讲,程序集甚至不必是使用此方法的物理文件.虽然D Stanley的方法通常被认为是更标准的.