2016-04-11 21 views
3

Ich verwende C# seit einem Jahr. Ich weiß, dass Sie über Interop/PInvoke auf nativen Code aus C# zugreifen können. Ich habe gerade angefangen, DirectX zu lernen und gelernt, dass eine der wenigen Möglichkeiten, DirectX mit C# zu verwenden, SharpDX ist, ein Wrapper, der in C++ und nicht in C# geschrieben ist. meine Frage ist; Seit C# unterstützt Interoperabilität und ermöglicht dem Programmierer den Zugriff auf native dlls/com-Objekte. Wie kommt es, dass diese Unterstützung nicht gültig ist, wenn es um DirectX dlls/coms geht? Ich bin sehr verwirrtWarum C# PInvoke nicht mit nicht verwaltetem DirectX arbeiten kann

Antwort

3

Dies ist nicht korrekt. SharpDX ist ein reiner C# -Wrapper, der einige C++/CLI-Techniken durch IL-Bytecode-Nachbearbeitung auf den .NET-Assemblys verwendet. Sehen Sie das Original post für weitere Details. (Im Abschnitt "So vermeiden Sie die Verwendung von C++/CLI in C#"). Zum Implementieren eines C++ - Interface-Callbacks in C# können Sie sich auch dieses post ansehen.

Auch ohne die IL Bytecode-Anweisung calli wäre es perfekt möglich, einen vollständigen Wrapper von COM-Objekten mit nicht verwalteten Delegaten zu entwickeln (über Marshal.GetFunctionPointerForDelegate). Sie können es auch mit regulären COM interop in C# tun.

Auf der anderen Seite, wenn die C++ - Objekte keine COM-Schnittstelle (dh nur reine virtuelle Methoden) zur Verfügung stellen, benötigen Sie einen vereinfachten C++ - Wrapper-Zugriff dafür oder befassen sich mit den Export-Mangelnamen für C++ - Objekte , afaik, nicht standardisiert)

+0

Danke, das war sehr aufschlussreich. Ich denke C# lernen, ohne CLR/IL zu lernen, ist ähnlich wie jemand, der ASP.Net lernt und dann annimmt, er/sie weiß, wie das Web funktioniert. Ich bin nur erstaunt über die Menge an C# -Programmierern (hauptsächlich in Game-Dev-Foren), die behaupten, dass es keine Möglichkeit gibt, DirectX mit C# zu verwenden, außer durch slimDX oder SharpDX –

2

PInvoke ist eher begrenzt und ist für C-style APIs, wie Windows-API. Es gibt sehr kleine Typen, die gemarsaled werden könnten.
Ähnliche Einschränkungen bestehen für COM-Interop.

DirectX-APIs sind meist C++ -. Sie können die C++ - Klasse nicht zwischen den Grenzen passieren - es ist ein Kopfzerbrechen. Aber C++/CLI ist ein Weg zu gehen - es hilft Ihnen, eine Art Brücke zwischen verwalteten und nativen Welt zu bauen.

Verwandte Themen