2016-04-11 7 views
3

C#を1年間使用していましたが、interop/PInvoke経由でC#のネイティブコードにアクセスできることがわかりました。 私はちょうどDirectXを学び始め、C#でDirectXを使用するいくつかの方法の1つは、C++ではなくC#で書かれたラッパーであるSharpDXのようなものを使うことです。 私の質問は、 C#は相互運用性をサポートし、プログラマがネイティブdll/comオブジェクトにアクセスできるようにするためです。このサポートは、DirectXのdll/comに関しては有効ではありません。私は非常に混乱していますC#PInvokeがアンマネージドDirectXで動作しない理由

答えて

3

これは正しくありません。 SharpDXは純粋なC#ラッパーで、.NETアセンブリのILバイトコードの後処理を通じてC++/CLI技術を使用しています。詳細はオリジナルのpostを参照してください。 (「C#でのC++/CLIの使用を避ける方法」の節を参照)。 C#でC++インタフェースコールバックを実装する場合は、postもご覧ください。

ILバイトコード命令がなくても、アンマネージドデリゲート(Marshal.GetFunctionPointerForDelegate経由)を使用してCOMオブジェクトの完全なラッパーを開発することは完全に可能です。また、C#で普通のCOM interopでそれを行うこともできます。

一方、C++オブジェクトがCOMインターフェイス(つまり純粋な仮想メソッドのみ)を提供しない場合は、単純化されたC++ラッパーアクセスまたはC++オブジェクトのエクスポートマングリング名を処理する必要があります。 、アフリカ、標準化されていない)

+0

ありがとう、これは非常に洞察力があった。私はCLR/ILを学ぶことなくC#を学ぶと思います。ASP.Netを学んでいる人と似ていて、Webの仕組みを知っていると仮定しています。私は、SlimDXやSharpDXを除いてC#でDirectXを使う方法がないと主張している(主にゲーム開発者フォーラムで)C#プログラマーの数に驚いている –

2

PInvokeはかなり限定されており、Windows APIのようなCスタイルのAPIに適用できます。 マーシャル可能な非常に小さなタイプのセットがあります。
COM interopにも同様の制限があります。

DirectX APIは主にC++のものです。境界の間でC++クラスを渡すことはできません - それは頭痛です。しかし、C++/CLIを使うことができます。管理された世界とネイティブ世界との間に何らかの橋渡しをするのに役立ちます。

関連する問題