0

現在、C#プロジェクトに取り組んでおり、C#の経験はありません。

C ++で記述されたDLLのセットがあり、それらは同じクラスと同じ機能を持っていますが、動作が異なります。たとえば、プログラムがBMPファイルを変換するとします。BMPをJPGに、BMPをPNGに変換するためのDLLがあります。

C#で書かれたプログラムは、どういうわけかそれらのDLLをラップする必要がありますが、静的な方法ではありません。実行時に使用中のDLLを変更し、必要に応じて(実行時にも)新しいDLLを追加できるようにしたいと考えています。プラグインのように、あなたがそうするなら。

このアプローチを実装するためのあなたの提案は何ですか?

4

4 に答える 4

2

これは良さそうです:http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

于 2012-07-10T05:42:19.447 に答える
1

すべてのDLLが事前にわからない場合は、Win32関数「LoadLibrary」「GetProcAddress」および「FreeLibrary」を呼び出す必要があります。私の知る限り、c#には一種の動的PInvokeを自動的に実行する方法がありません。詳細については、このブログ投稿を参照してください

または、PInvokeを使用してDLLごとにC#ラッパーを作成し、マネージデリゲートを使用して関数を呼び出すこともできます。次に、デリゲートを変更することにより、実行時に別の関数(おそらく別のDLLで)を呼び出すことができます。これは、コンパイル時に使用する予定のDLLの完全なリストがあるかどうかによって異なります。ただし、最初のオプションよりもかなり堅牢です。また、ランタイムにすべてのマーシャリングを処理させるのも1000倍簡単です。詳細については、このMSDNの記事を参照してください。

于 2012-07-10T05:38:44.980 に答える
1

それらがすでにC++にある場合は、マネージアセンブリをC++で作成することを選択します。
このウォークスルーは出発点になる可能性があります。特にC++の人はC#を学ぶ必要はありません。
P / Invokeは少し遅くなりますが、P / Invokeは実行時の例外につながり、変更があった場合にコンパイルエラーが発生しないため、より深い問題はバージョン管理にあります。

于 2012-07-10T05:50:11.337 に答える
0

externマイクロソフトが提供する機能を使用したり、気に入ったりすることができますDLLImport。詳細については、こちらまたはこちらをご覧ください

于 2012-07-10T05:37:03.577 に答える