8

私たちのプロジェクトでは、asp.net アプリケーションで COM を介して多くの Delphi コードを再利用しています。

このように: 従来のデルファイ dll => デルファイ COM ラッパー => .Net 相互運用 => asp.net (mvc)

アクセス違反、dll のアンロードなどに関する問題がいくつかあります... P/Invoke コードを介して直接レガシー dll を使用するようにいくつかを移植しました。

COM と P/Invoke に関するリソースを見ると、ほとんどの場合、COM を使用するようアドバイスされています。何故ですか?P/Invoke には次の利点があります。

  • チェックアウトされたコードは、最後に登録された COM ではなく、常に正しい dll を使用します。
  • 複数のバージョンをサーバー上で並行して実行できます (例: DEV、TEST、QA)
  • COM 登録の煩わしさはもうありません
  • COM 通信よりもはるかに高速 (私が読んだ記事では 30% の速度向上が示されています)
4

1 に答える 1

11

PInvoke は非常に優れたツールですが、COM の代わりにはなりません。PInvoke は、C 構文の単純な関数のみをサポートします。COM を使用すると、オブジェクト モデルを実装できます。Microsoft.Office.Interopたとえば、名前空間のクラスを見てみましょう。これらはすべて、ラッパーを持たない純粋な COM クラスです。Office と PInvoke の相互運用を行うのは、非常に苦痛です。

PInvoke のもう 1 つの重要な問題は、通常、宣言を作成するのが、クライアント プログラマー (正しく理解する可能性が最も低い人物) の負担であるということです。COM の作成者は、.NET アセンブリのメタデータと同様に、自動生成されたタイプ ライブラリを発行できます。これにより、ミスの可能性が大幅に排除され、[プロジェクト] > [参照の追加] 以外のクライアント プログラマーの作業が不要になります。

箇条書きに対処する:

  • チェックアウトされたコードは、最後に登録された COM ではなく、常に正しい DLL を使用し
    ます。適切な DLL を見つける気まぐれな Windows の影響を受けます。事故を回避する唯一の良い方法は、DLL を EXE と同じディレクトリに格納することです。これは、COM でも可能です。あなたがしなければならないのは、名前で空のファイルを作成することだけですyourapp.exe.local

  • 複数のバージョンをサーバー上で並行して実行できます (例: DEV、TEST、および QA)
    。上記の手法を使用するか、reg-free マニフェストを使用することにより、COM でも問題ありません。

  • COM 登録の煩わしさはもうありません
    reg-free マニフェストを使用するため、登録は不要です。やることは非常に簡単です。Isolated参照のプロパティを に設定するだけTrueです。

  • COM 通信よりもはるかに高速です (私が読んだ記事によると、30% の速度向上が示されています) 。COM よりも
    はるかに低速です。を介してレイト バインド COM 呼び出しを行うと、追加のコストが発生する可能性がありますIDispatch。これは、リフレクションを使用して呼び出しを行うのとほぼ同じくらい高価です。


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

于 2012-06-07T10:34:39.330 に答える