2016-09-26 52 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持有文件夾(相對於可執行文件)將在其中搜索程序集的位置。

相關問題