1

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

Visual Studioは、自分のライブラリにIStream定義を作成します。どうすればそれを止めて、COMTypes IStreamを使用できるようにできますか?3つの答えのうちの1つがあるようです:いくつかのインポートを追加します

  • IStreamを再宣言しないようにidlに追加します(MSCOREEをインポートするとそれは実行されますが、C#の問題は解決されません)
  • どういうわけか、Visual StudioでIStreamのエイリアスを作成しますが、これを行う方法がわかりません。
  • 私の考えはすべて完全に間違っているので、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;
  };

};
4

2 に答える 2

1

あなたが見たり経験したりしているのは、MIDLコンパイラの機能(しばしば厄介なもの)です。「ライブラリ」セクション内で参照されるタイプはすべて、その定義がtlb(タイプライブラリ)に挿入されます。IUnknownインターフェイスとMIDL基本型(およびおそらくさらにいくつかのプリミティブ型)を除いて。「あなたの」IStreamで見られるこれらの奇妙なメソッドは、基本タイプであるISequentialStreamからのものです。いくつかのオプションがあります。

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

  2. それを無視します。使用しないでください。代わりにSystem.Runtime.InteropServices.ComTypes.IStreamを使用してください。(.Netで)使用しているインターフェイスが正しい属性(Guid、InterfaceTypeなど)でマークされている限り、それらは交換可能です。渡すタイプを受け入れるように、タイプライブラリまたは相互運用コードを編集する必要があります。(有効な定義を持つ)任意のIStreamインターフェースを使用できるように、オブジェクトを使用します。また、古いTlbImpツールは使用しないでください。新しいTlbImp2(C#およびオープンソースで記述)https://clrinterop.codeplex.com/releases/view/17579を使用します。これにより、TLBからマネージドへの変換を実際にカスタマイズでき、コンパイルされた相互運用DLLの代わりに、またはそれに加えて、ソースファイルを生成することができます。

于 2014-09-24T08:46:15.253 に答える
0

これを修正する必要はありません。タイプライブラリから作成された相互運用ラッパーで問題ありません。ComTypes.IStream宣言は、マネージコードがIStreamを実装するCOMサーバーを実装できるようにするため、またはIStreamを引数として使用できるようにするためにあります。多くの.NETフレームワーククラスがそうします。

于 2010-04-22T14:59:21.947 に答える