6

C# NPAPI プラグインをビルドしようとしているときに、DLL がやその他のメソッドなどのいくつかのメソッドを実装する必要があることを説明するチュートリアルを見つけました。NP_GetEntryPointsNP_InitializeNPP_New

_NPPluginFuncsただし、私が理解したいのは、これらのメソッド名を単純にミラーリングし、C#の記事 (のような) で説明されているように同等のデータ構造を構築でき、すべてが機能するかどうかです。

どなたか親切に指導をお願いできますか?C# で NPAPI プラグインを構築することは可能ですか?もしそうなら、関連する基本的な手順は何ですか?

4

2 に答える 2

4

ゲオルク・フリッチェがコメントで述べているように:

NPAPI プラグインは基本的に DLL であり、必要な C エクスポートがいくつかあります。

また、C# で記述されたアセンブリから (C エクスポートの意味で) 関数をエクスポートする組み込みの方法はありません。

オプションのいくつかは次のとおりです。

  1. 関数を直接エクスポートできる混合モード C++ アセンブリ。これは、プラグインのホスト プロセスで CLR をホストする場合に影響を与える可能性があります。
  2. エクスポートをホストし、COM 相互運用機能を使用してプラグイン機能を含む C# アセンブリに委任する小さなネイティブ DLL。いわゆる「reverse p/invoke」を行う「公式」の方法。
  3. フルマネージド アセンブリを後処理し、カスタム属性でマークされた静的メソッドを名前付き関数エクスポートに変換する興味深いプロジェクト。(私はこのプロジェクトとは何の関係もありません。誰かが COM 相互運用のやり方を改善したのではないかと思い始めたときに、偶然このプロジェクトに出会いました。)
于 2012-07-06T14:53:41.940 に答える
4

ドキュメントに記載されているように:

NPAPI ブラウザ プラグインは、本質的に、いくつかの特定のエントリ ポイントを持つ単純な DLL です。

つまり、通常の dll から一部の関数をエクスポートする必要があり、これは通常 C/C++ で行われます。残念ながら、プレーンな C# dll からエントリ ポイントを公開することはできませんが、この回答を見てください。何らかの努力をすれば、ある種のポスト ビルド ツールによって一部のエクスポートをだますことができるようです。

いずれにせよ、複雑なデータ構造をプラグイン インターフェイスとの間で受け渡しすることを期待しないでください。面倒です。さらに調査を行うことに興味がある場合、使用するキーワークは"reverse P/Invoke"です。これは、マネージド ワールドから通常の dll を呼び出す直接 P/Invoke と同様です。

C# dll が直接「エントリ ポイント」を公開できない理由は、 エントリ ポイントが実際には、すぐに実行可能なアセンブリ コードを指す dll 内のアドレスにすぎないためです。C# dll は別の種類の獣です。これらは、「ジャスト イン タイム」でコンパイルされた IL を含むファイルであり、実際にそのようなコンパイルは、いくつかの OS トリックで強制的に行われます。これが、reverse P/Invoke が単純明快ではない理由です。

于 2012-07-05T13:19:30.313 に答える