[英]Side by Side dependency between C++ and C#
我正在使用FireBreath Framework創建瀏覽器插件。 大多數邏輯是用C#編寫的,要從瀏覽器中調用它,我做了一個C ++包裝器。 瀏覽器調用C ++本機代碼,該代碼調用“代理”托管C ++代碼,該代碼調用C#項目中的實際邏輯。
所以我有3個dll:
所有3個dll安裝到用戶目錄(c:\\ Users \\\\ AppData \\ Roaming \\ MyCompany \\ MyApp \\ 1.0.0.0)
問題是瀏覽器無法加載C#dll。 我使用並排清單來聲明依賴關系。
我試圖制作一個單獨的清單文件來聲明一個程序集:
<?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(Native 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>
嘗試使用#pragma指令鏈接依賴的dll:
#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檢查了依賴性,它確認了Managed C ++和C#之間不存在什么依賴性。
插件有權訪問頭dll(本機C ++),並且在托管C ++調用C#dll時,它也會加載托管C ++,但它會加載-插件失敗,找不到C#程序集。
如果我將C#dll與瀏覽器應用程序(firefox.exe或chrome.exe)放在同一目錄中,則可以正常工作。
似乎托管C ++和C#之間並排依賴性不起作用。
如何為插件加載依賴的dll?
解決了。
向C ++ / CLI代理程序集添加了ResolveEventHandler處理程序,該程序集從用戶目錄加載C#程序集。
恐怕我對Firebreath或程序集依賴項清單一無所知,但是有一個可能的解決方法。
您是否考慮過使用C ++ / CLI在C ++本機代碼和C#之間提供包裝器 ? 如果要在Windows上的VisualStudio中進行編譯,則只需設置/ clr開關,就可以創建一個C ++庫以允許混合的托管/本機代碼。 然后,您可以直接從混合的C ++ / CLI dll中引用C#程序集並直接調用它。 只要C#程序集在同一目錄中,它就應該起作用。
實際上,您可以進一步定義整個程序集為混合C ++ / CLI-將所有托管元素導入此DLL。 如果您已經在C#中擁有大量代碼,那么我不建議您這樣做,但這是將來要考慮的事情。
最好的祝福,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.