2012-01-23 53 views
4

我正在使用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?

+0

您在FireBreath IRC會議室詢問這個問題;不幸的是,由於我從來沒有這樣做,我根本不知道。不過,作爲一個插件不會和任何其他應用程序有所不同,除了你只能修改加載另一個DLL的DLL,而不是應用程序本身。 – taxilian

回答

0

恐怕我對Firebreath或程序集依賴關係清單一無所知,但對您有潛在的解決方法。

你有沒有考慮在C++本機代碼和C#之間使用C++/CLI to provide a wrapper?如果您正在Visual Studio中的Windows上編譯,則可以通過設置/ clr開關來創建C++ lib以允許混合管理/本機代碼。然後,您可以直接從您的混合C++/CLI dll引用C#程序集並直接調用它。只要C#程序集在同一個目錄中,它應該可以工作。

實際上,您可以進一步將整個程序集定義爲混合C++/CLI - 將所有託管元素導入到此DLL中。如果你已經在C#中有廣泛的代碼,我不會建議這樣做,但這是未來需要考慮的事情。

最好的問候,

+0

我有3個DLL - 本機C++,託管C++/CLI和C#。因此,我已經使用C++/CLI庫作爲託管/非託管代碼之間的代理。 –

+0

@AndreyOsipov doh shucks。好吧,我剛剛提出了一些建議。 –

2

解決了它。

將ResolveEventHandler處理程序添加到從用戶目錄加載C#程序集的C++/CLI代理程序集。