我正在使用FireBreath框架製作瀏覽器插件。大多數邏輯都是用C#編寫的,並且從瀏覽器中調用它我已經制作了一個C++包裝器。瀏覽器調用調用「代理」的C++本機代碼在C#項目中調用實際邏輯的託管C++代碼。C++和C之間的並排依賴關係#
所以我有3倍的DLL:
- 頭本地C++ DLL取決於託管C++;
- 託管C++依賴於C#;
- 包含主邏輯的C#dll。
安裝到用戶目錄全部3倍的DLL(C:\用戶\\應用程序數據\漫遊\ MyCompany的\ MyApp的\ 1.0.0.0)
問題是瀏覽器並不加載C#DLL。我使用Side by Side清單來聲明依賴關係。
我試圖使一個單獨的清單文件中聲明的組件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/>
<file name="FirstDependency.dll"/>
<file name="SecondDependency.dll"/>
</assembly>
並加入連結此依賴於頭部的DLL(母語C++):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/>
</dependentAssembly>
</dependency>
</assembly>
另外我試圖直接在頭dll(Native C++)聲明依賴關係:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="FirstDependency.dll"/>
<file name="SecondDependency.dll"/>
</assembly>
試圖鏈接依賴d使用#pragma指令LLS:
#pragma comment(linker, "\"/manifestdependency:type='win32' name='FirstDependency' version='1.0.0.0' processorArchitecture='X86' language='*'\"")
#pragma comment(linker, "\"/manifestdependency:type='win32' name='SecondDependency' version='1.0.0.0' processorArchitecture='X86' language='*'\"")
我檢查使用的Dependency Walker依賴關係,並確認託管C++和C#之間有什麼相關性不存在。
插件可以訪問head dll(Native C++),它也加載了Managed C++,但是當Managed C++調用C#dll - 插件失敗時,C#程序集無法找到。
如果我將C#dll與瀏覽器應用程序(firefox.exe或chrome.exe)放在同一個目錄中 - 它可以工作。
看起來像並排依賴不能在託管C++ & C#之間工作。
我如何爲我的插件加載依賴的dll?
您在FireBreath IRC會議室詢問這個問題;不幸的是,由於我從來沒有這樣做,我根本不知道。不過,作爲一個插件不會和任何其他應用程序有所不同,除了你只能修改加載另一個DLL的DLL,而不是應用程序本身。 – taxilian