2016-09-26 331 views
1

我创建了一个C++包装类库来导入C++本机dll。我已经将这个C++类库的项目引用添加到我的C#应用​​程序,并将所有依赖项复制到Debug文件夹。到目前为止,除非我想为该C++本地dll的旧版本执行相同的过程,否则每件事情都可以正常工作。很明显,我不能有两个dll(s)具有相同的名称和文件夹中的依赖关系的相同名称。所以我决定为每个版本的C++包装器提供一个c#程序集包装器,并让每个程序集dll和依赖项放在一个分开的文件夹中。我试图用Assembly.LoadFrom()在运行时加载包装程序集 - 时间和它加载程序集,但是,当它到达的Invkode行:如何在使用Assembly.loadfrom()时解决程序集在C#中的依赖关系()

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

它抛出一个异常说:

无法加载文件或程序集“MDVRCLib,版本= 1.0.6110.25310,文化=中立,PublicKeyToken =空'或其中一个依赖。该系统找不到指定的文件。

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

回答

0

您可以连接到静态AssemblyResolve事件

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

此外AssemblyResolve事件时, '探测' 元素可以在应用程序配置文件中使用这样的:

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

的privatePath持有文件夹(相对于可执行文件)将在其中搜索程序集的位置。

相关问题