簡體   English   中英

C ++和C#之間的並排依賴

[英]Side by Side dependency between C++ and C#

我正在使用FireBreath Framework創建瀏覽器插件。 大多數邏輯是用C#編寫的,要從瀏覽器中調用它,我做了一個C ++包裝器。 瀏覽器調用C ++本機代碼,該代碼調用“代理”托管C ++代碼,該代碼調用C#項目中的實際邏輯。

所以我有3個dll:

  • 依賴於托管C ++的本地C ++ dll;
  • 依賴C#的托管C ++;
  • 包含主要邏輯的C#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM