C ++ dll / h / lib / xml / exeベースのSDKをCOMに「ラップアップ」して、C#2.0プロジェクトで使用する必要がある

StackOverflow https://stackoverflow.com/questions/417146

  •  03-07-2019
  •  | 
  •  

質問

C ++ dll、lib、exe、およびさまざまな.hファイルで作成されたSDKを手に入れました。私はそれがC ++開発者向けであることを前提としています。ドキュメントとともに提供されるサンプルプロジェクトはすべてC ++で記述されています。 Visual Studio 8(2005)でそれらを起動して実行できます。アドバタイズされたとおりにデバイスを制御します。ただし、これを使用する必要があるプロジェクトはC#.Net 2.0にあり、変更できません。

上司はC ++開発者であり、COMオブジェクトとしてコンパイルしてから、C#ソリューションにCOMオブジェクトをインポートするだけでいいと言っています。上司は、「ラップ」するのに1時間もかからないはずだと言っています。 C ++のコンパイルに関する知識がなくても、SDKがCOMオブジェクトとして作成されます。

以前にC#ソリューションでCOMオブジェクトを使用したことがあるので、一度作成したら、問題なくそこから続行できます。

ただし、2つの.dllファイル、1つの.exeファイル、1つの.libファイル、1つの.xmlファイル、および12の.hファイルからCOMオブジェクトを作成する方法がわかりません。これを実現するために何をすべきかを教えてくれるリソースはありますか?

役に立ちましたか?

解決

  

上司はC ++開発者であり、COMオブジェクトとしてコンパイルし、COMオブジェクトをC#ソリューションにインポートするだけでいいと言っています。

それは本当です、しかしそれをCOMオブジェクトとしてコンパイルすることは「難しい」です。 (つまり、COM APIを既に実装している場合を除き、それを実行できないことを意味します(COMオブジェクトとしてビルドする前にCOM APIを実装する必要がない場合)。

C ++を使用してCOMオブジェクトを作成する方法を説明する書籍(たとえば、 Essential COM )がありますが、それは簡単ではありません(COMオブジェクトを作成する場合は、エッセンシャルCOM 、C ++より優れた/簡単なツール)。

あなたや上司には3つのオプションがあると思います:

  1. ベンダーにCOMオブジェクトとして提供するよう依頼する
  2. SDKのAPIをラップするCOM APIを設計します。このAPIをエクスポートするCOMプロジェクトを(選択した言語で)作成します。基になるSDKメソッドを呼び出して、これらのAPIを実装します。これを行うには、C ++を知っているか、「1時間」よりもはるかに長い時間を費やす人が必要になる場合があります。このプロジェクト。
  3. COMの使用は忘れてください。代わりに、SDKをDLLとしてビルドし、PInvokeを使用して.NETコードから呼び出します。
  

上司は、「ラップ」するのに1時間もかからないはずだと言っています。 C ++のコンパイルに関する知識がなくても、SDKがCOMオブジェクトとして作成されます。

あなたの言ったことに基づいて、私はそれを実現する方法を知りません。

他のヒント

上司にラップするのに1時間もかからない場合は、上司に伝えてください。彼は必ずやるべきです。両方の時間をより効率的に使用することです。

ATL(属性を使用しない)もお勧めしますが、経験がない場合は、これを正しく行うのに時間がかかることがあります。

  

上司はそれよりも少ない時間で済むと言っています   「ラップ」するのに1時間SDKとして   COMオブジェクト、私にとっても   C ++コンパイルの知識。

これは、経験のあるC ++ / COM開発者には当てはまるかもしれませんが、初心者には当てはまりません。最善の策は、ATLを使用することです。 MSDNチュートリアルをご覧ください。

属性を使用しない

これはあなたの質問にはまったく答えませんが、...

COMオブジェクトを作成する代わりに、P / Invokeを使用して、DLL内のメソッドを呼び出すだけです。

このスレッドMSDNフォーラムのには、P / Invokeを使用して呼び出すDLLの作成方法が記載されています。

もちろん、クラス全体にアクセスする必要がある場合(および上記のオブジェクトのインスタンスを作成する場合)、これは役に立ちません。

コードがコンパイルされて実行されるのは良いことです。つまり、1時間でこれができると仮定するのはまったく不公平です。

Visual Studioで実際にビルドされているものを確認しました。既にCOMオブジェクトを構築している可能性があります。

コードの呼び出し方法を調査します。コードをテストするために実行できる.exeがあると思います。 VC ++デバッガーでこれをステップ実行し(C#コードのデバッグに十分似ています)、ドキュメント/期待に一致するAPI呼び出しを特定します。この知識は、P / Invokeルートに移動する場合に役立ちます。

他に検討すべきものは、 SWIG です。これは通常、C / C ++コードをラップするためにPython開発者によって使用され、C#のサポートを提供します。

マネージC ++ルートは、最も単純なコードを除くすべてのメモリ割り当てについて多くのことを理解する必要があるため、経験豊富なC ++開発者にはおそらくお勧めです。

私(まあ、本当に私のリードと私)は最初に、会社が提供したSDKのdllに対して(System.Runtime.InteropServicesのDllImport機能を介して)p / Invokeを使用してみます。どうなるかお知らせします。

本当に欲しい/必要なものはC ++ / CLIであると思います。そうすれば、マネージアセンブリに直接ビルドできます。アイデアは、C#とC ++のクロスのように見える非常に単純なラッパーを作成し、残りを実行することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top