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++ から簡単に呼び出せるネイティブ コードに最適です。