5

FireBreath Framework を使用してブラウザ プラグインを作成しています。ほとんどのロジックは C# で記述されており、ブラウザから呼び出すために C++ ラッパーを作成しました。ブラウザーは、C# プロジェクトで実際のロジックを呼び出す「プロキシ」マネージ C++ コードを呼び出す C++ ネイティブ コードを呼び出します。

だから私は3つのdllを持っています:

  • Managed C++ に依存する head ネイティブ C++ dll。
  • C# に依存するマネージ C++。
  • メイン ロジックを含む C# dll。

ユーザー ディレクトリにインストールされた 3 つの dll すべて (c:\Users\\AppData\Roaming\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 (ネイティブ 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# の間に存在しない依存関係が確認されました。

プラグインは head dll (ネイティブ C++) にアクセスでき、Managed C++ もロードしますが、Managed C++ が C# dll を呼び出すと、プラグインが失敗し、C# アセンブリが見つかりません。

C# dll をブラウザ アプリケーション (firefox.exe または chrome.exe) と同じディレクトリに配置すると、動作します。

Managed C++ と C# の間で Side By Side 依存関係が機能しないようです。

プラグインに依存する dll をロードするにはどうすればよいですか?

4

2 に答える 2

2

解決しました。

ユーザー ディレクトリから C# アセンブリをロードする C++/CLI プロキシ アセンブリに ResolveEventHandler ハンドラーを追加しました。

于 2012-01-24T07:01:47.217 に答える
0

残念ながら、Firebreath やアセンブリの依存関係マニフェストについては何も知りませんが、潜在的な回避策があります。

C++/CLI を使用して、C++ ネイティブ コードと C# の間のラッパーを提供することを検討しましたか? Windows で VisualStudio を使用してコンパイルする場合、/clr スイッチを設定するだけで、マネージド コードとネイティブ コードを混在させることができるように C++ ライブラリを作成できます。次に、混合 C++/CLI dll から C# アセンブリを直接参照し、直接呼び出すことができます。C# アセンブリが同じディレクトリにある限り、動作するはずです。

実際には、さらに進んでアセンブリ全体を混合 C++/CLI として定義し、すべてのマネージ エレメントをこの DLL にインポートすることもできます。すでに C# で大量のコードを作成している場合は、これを行うことはお勧めしませんが、将来のために検討する必要があります。

よろしくお願いします、

于 2012-01-23T12:38:20.053 に答える