2012-06-07 6 views
6

私たちのプロジェクトでは、asp.netアプリケーションでCOMを使用して、たくさんのDelphiコードを再利用しています。.NETでP/InvokeよりもCOM相互運用が優先されるのはなぜですか?

このよう

:我々は、などアクセス違反、DLLのアンロード、に関するいくつかの問題を抱えているレガシーデルファイのdll =>デルファイCOMラッパー=>ネット相互運用=> asp.net(MVC)

...私が持っていますP/Invokeコードを介して従来のDLLを直接使用するように移植しました。

COMとP/Invokeに関するリソースを見ると、ほとんどの場合、COMを使用するためのアドバイスがあります。何故ですか?

  • コードが常に
  • 複数のバージョンは、例えば(サーバ上に並べて実行することができ、正しいDLLの代わりに最後に登録COMを使用します。チェックアウト:P /呼び出しは、次のような利点を持っていません:COM通信Iが30%の高速化を示して読んで(記事)
+0

64ビットプロセスから32ビットのDLLにp/invokeできますか?私はそうは思わない。 – Bond

+1

COMがP/Invokeよりも優先されることを示唆する参考資料をいくつか教えてください。私は、P/Invokeが利用可能な場合はより良い解決策であることに非常に同意します。 .NET BCLの内部構造のほとんどは、P/Invokeの観点からWin32 APIに実装されています。 COM相互運用機能を使用する理由は、選択肢がない場合のみです。 Officeアプリケーションとの相互運用性、COM専用のWindows APIパーツなどがあります。 – Govert

+0

DLLを覚えていますか?正しいdllを使用する代わりに、同じ名前の使用可能な最初のdllファイルを使用します。 APIの変更は実行時まで検出されません。つまり、バージョン管理はすべて不可能です。関数自体の名前を変更せずに、古いクライアントと新しいクライアントの両方に役立つDLLを作成することはできません。 –

答えて

8

のPInvokeは非常に便利なツールですが、それは確かにあるよりもはるかに高速

  • 面倒DEV、TESTおよびQA)
  • は、これ以上のCOM登録ませんn o COMの代わりに使用します。 PinvokeはC構文の単純関数のみをサポートしているため、COMではオブジェクトモデルを実装できます。たとえば、Microsoft.Office.Interop名前空間のクラスは、ラッパーのない純粋なCOMクラスです。 pinvokeとのオフィスinteropを行うことはひどく痛いでしょう。

    pinvokeのもう一つのコアの問題は、クライアントプログラマが宣言を書き込む負担が大きいことです。その人はそれを得る権利がほとんどありません。 COM作成者は、.NETアセンブリのメタデータによく似た自動生成タイプライブラリを公開できます。間違いの可能性を大幅に排除し、クライアントプログラマーがProject + Add Referenceを超えて必要とする作業を大幅に削減しました。あなたの弾丸をアドレッシング

    • は、コードは常にあなたはまだ適切なDLLを見つけるのWindowsの気まぐれの対象となる正しいDLLの代わりに最後に登録COM
      のを使用しますチェックアウト。事故を避ける唯一の良い方法は、EXEと同じディレクトリにDLLを格納することです。これは、同様にCOMで十分に可能であるあなたがしなければならないすべてはyourapp.exe.local

    • 複数のバージョンが(例えば:DEV、TESTおよびQA)をサーバ上に並べて実行することができます名前で空のファイルを作成することです
      上記の手法を使用するか、またはreg-freeマニフェストを使用してCOMに問題はありません。

    • COM登録は面倒ではありません
      登録不要なので、reg-freeマニフェストを使用してください。非常に簡単です。参照の分離プロパティをTrueに設定するだけです。

    • COM通信よりもはるかに高速ではそれがCOMよりはるかに遅い
      (私が読ん記事は、30%の高速化を示しています)。 IDispatchを介して遅延バインドされたCOM呼び出しを作成することにより、余分なコストがかかる可能性があります。これは、ピンボケ呼び出しとほぼ同じくらい高価です。


    ネイティブコードの相互運用を行うための第三の方法があります:C++/CLI言語でマネージクラスラッパーを書きます。 .NETフレームワーク、特にmscorlib.dll、System.Data、およびPresentationFrameworkで頻繁に使用されるテクニックで、ネイティブコードに強い依存関係を持つアセンブリです。 Delphiにはあまり適していませんが、CやC++から簡単に呼び出せるネイティブコードに最適です。

  • +0

    偉大な答え。私はregフリーのマニフェストを試みましたが、少なくともVisual Studio(孤立したプロパティ)内からではなく、動作させることができませんでした。 "yourapp.exe.local"が正しいCOMを見つける動作をどのように変更するのかよく分かりません。 – Cohen

    +0

    私は "それは動作しません"の質問に答える方法がわかりません。 .localファイルは、レジストリキーで指定されたパスに関係なく、EXEが含まれているディレクトリのみをWindowsローダに表示するように指示します。原油とマニフェストの代用品はありませんが、それは確かに便利です。 –

    +0

    「それは動作しません」質問。わかりました。私はマニフェストファイルをさらに調べなければなりません。私は.localがasp.net環境の解決策になるとは思わない。私が間違っていないなら、この場合のexeはIISワーカープロセスでしょうか? – Cohen

    関連する問題