IDLでiStreamを宣言するにはどうすればよいですか?Visual Studioはそれをマップしてswinterop.comTypesにしますか?
質問
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から来ています。いくつかのオプションがあります:
Midlコンパイラと何日も格闘して、ISTream(およびその他すべてのサポートタイプ)の注入からそれを取得しようとします。私はこれをしました。 Mscoreeでもありました。問題は、MIDLコンパイラがライブラリステートメントに遭遇したときに「OAIDL.IDL」を自動的にインポートすることです。したがって、これらのタイプ(ストリームなど)は、それについて何かをする機会がある前に、すでに現在のIDLコンテキストに注入されています。これは、文書化されていない機能です。結論は、iStreamへのハード参照を削除しない限り、何をしてもそれを行うことです(pvoid [*]ストリームを使用)。
それを無視します。それを使わないでください。 System.runtime.interopservices.comtypes.istemを使用する代わりに使用します。 (.NETで)使用しているインターフェイスに正しい属性(GUID、InterfaceTypeなど)がマークされている限り、それらは交換可能です。タイプライブラリまたはInteropコードを編集して、渡す型を受け入れる必要があります。任意のISTREAMインターフェイスを使用できるように、オブジェクトを使用します(有効な定義を使用)。また、古いTLBIMPツールも使用しないでください。新しいTLBIMP2(C#とオープンソースで記述)を使用します https://clrinterop.codeplex.com/releases/view/17579. 。これにより、TLBから管理された変換を実際にカスタマイズすることができ、コンパイルされたInterop DLLの代わりにソースファイルを生成できます。