IDLでiStreamを宣言するにはどうすればよいですか?Visual Studioはそれをマップしてswinterop.comTypesにしますか?

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

質問

C#クライアントからストリームを取得して処理する必要があるcomオブジェクトがあります。 iStreamを使用する必要があるように思われます。だから私は以下のように私のIDLを書きます。次に、MIDLを使用してTLBにコンパイルし、ソリューションをコンパイルし、登録してから、ライブラリへの参照をC#プロジェクトに追加します。

Visual Studioは、私自身のライブラリにISTREAM定義を作成します。どうすればそれを止めて、comtypes iStreamを使用させることができますか? 3つの回答のいずれかがあるようです:インポートを追加する

  • IDLにISTREAMを再取得しないように(MSCOREEをインポートすることはそれを行いますが、C#の問題は解決しません)
  • どういうわけかビジュアルスタジオのISTREAMをエイリアスしますが、これを行う方法はわかりません。
  • 私の考えはすべて完全に間違っています、そして私はイストリームをまったく使うべきではありません

助けて...ありがとう

[
  uuid(3AC11584-7F6A-493A-9C90-588560DF8769),
  version(1.0),
]
library TestLibrary
{

  importlib("stdole2.tlb");

  [
    uuid(09FF25EC-6A21-423B-A5FD-BCB691F93C0C),
    version(1.0),
    helpstring("Just for testing"),
    dual,
    nonextensible,
    oleautomation
  ]
  interface ITest: IDispatch
  {
    [id(0x00000006),helpstring("Testing stream")]
    HRESULT _stdcall LoadFromStream([in] IStream * stream, [out, retval] IMyTest ** ResultValue);
  };

  [
    uuid(CC2864E4-55BA-4057-8687-29153BE3E046),
    noncreatable,
    version(1.0)
  ]
  coclass HCTest
  {
     [default] interface ITest;
  };

};
役に立ちましたか?

解決

これには修正は必要ありません。タイプライブラリから作成されたInteropラッパーは問題ありません。 comtypes.istream宣言は、管理されたコードがiStreamを実装するか、それを引数として実装するcomサーバーを実装できるようにするためにあります。 .NETフレームワークのクラスがたくさんあります。

他のヒント

あなたが見て経験しているのは、Midlコンパイラの機能(しばしば迷惑なもの)です。 「ライブラリ」セクション内で参照される任意のタイプには、定義がTLB(タイプライブラリ)に注入されます。 Iunknown Interfaceとを除きます ミッドルベースタイプ, 、(そしておそらくもっと原始的なタイプ)。 「Your」ISTREAMに表示されているこれらの奇妙な方法は、ベースタイプ、IsequertialStreamから来ています。いくつかのオプションがあります:

  1. Midlコンパイラと何日も格闘して、ISTream(およびその他すべてのサポートタイプ)の注入からそれを取得しようとします。私はこれをしました。 Mscoreeでもありました。問題は、MIDLコンパイラがライブラリステートメントに遭遇したときに「OAIDL.IDL」を自動的にインポートすることです。したがって、これらのタイプ(ストリームなど)は、それについて何かをする機会がある前に、すでに現在のIDLコンテキストに注入されています。これは、文書化されていない機能です。結論は、iStreamへのハード参照を削除しない限り、何をしてもそれを行うことです(pvoid [*]ストリームを使用)。

  2. それを無視します。それを使わないでください。 System.runtime.interopservices.comtypes.istemを使用する代わりに使用します。 (.NETで)使用しているインターフェイスに正しい属性(GUID、InterfaceTypeなど)がマークされている限り、それらは交換可能です。タイプライブラリまたはInteropコードを編集して、渡す型を受け入れる必要があります。任意のISTREAMインターフェイスを使用できるように、オブジェクトを使用します(有効な定義を使用)。また、古いTLBIMPツールも使用しないでください。新しいTLBIMP2(C#とオープンソースで記述)を使用します https://clrinterop.codeplex.com/releases/view/17579. 。これにより、TLBから管理された変換を実際にカスタマイズすることができ、コンパイルされたInterop DLLの代わりにソースファイルを生成できます。

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