如何在使用Assembly.loadfrom()

时间:2016-09-26 19:02:47

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

我创建了一个C ++包装类库来导入C ++本机dll。我已经将这个C ++类库的项目引用添加到我的C#应用​​程序中,并将所有依赖项复制到Debug文件夹中。到目前为止,除非我想为旧版本的C ++本机dll执行相同的过程,否则每件事情都能正常工作。显然,我不能为文件夹中的依赖项创建两个名称相同且名称相同的dll。所以我决定为每个版本的c ++包装器安装一个c#程序集包装器,并将每个程序集dll及其依赖项放在一个单独的文件夹中。

鉴于我不能再使用项目引用,因为它需要将引用dll复制到可执行应用程序的同一文件夹中,我尝试使用 Assembly.LoadFrom()来在运行时加载包装程序集并加载程序集但是当它到达Invkode行时:

bject[] p = new object[] { command, null,format,handle};
uint ret= (uint) mi.Invoke(obj,p)

它抛出一个例外说:

  

无法加载文件或程序集' MDVRCLib,Version = 1.0.6110.25310,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。系统找不到指定的文件。

如果我将此程序集用作项目引用并将其所有依赖项复制到项目文件夹,它将再次正常工作。我想知道当我使用Assembly.LoadFrom()从不同的文件夹加载程序集时,我如何解决程序集的依赖关系,以防止出现这样的错误?

2 个答案:

答案 0 :(得分:2)

除了AssemblyResolve事件,'probing'元素可以在应用程序配置文件中使用,如下所示:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

privatePath保存要搜索程序集的文件夹(相对于可执行文件)。

答案 1 :(得分:0)

您可以附加到静态 AssemblyResolve事件

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
    //determine the required assembly using "e.Name"
    var filename = "....."; 
    return Assembly.LoadFile(filename)
};