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
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)
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.
- 1. Debugging sowohl von verwaltetem C# -Code als auch von nicht verwaltetem C++ -Code in einer Lösung
- 2. Unterschiede von Zeigern zwischen nicht verwaltetem C++ und verwaltetem C++
- 3. C++/CLI Thread-Synchronisierung einschließlich verwaltetem und nicht verwaltetem Code
- 4. Warum kann Rails nicht mit mod_ruby arbeiten?
- 5. Übergabe von Zeigern aus nicht verwaltetem Code mit out-Modifikator
- 6. C#/C++ pInvoke Tipps
- 7. kann nicht processID von GetProcessID (.. hWnd) (PInvoke)
- 8. Generieren WCF-Proxy in nicht verwaltetem C++
- 9. Debuggen von nicht verwaltetem Code beim Debuggen von verwaltetem Code
- 10. Wie kann ich WPFs D3DImage mit verwaltetem DirectX oder XNA verwenden?
- 11. Kann Dateien in C++ nicht öffnen (DirectX-App) Zugriff verweigert
- 12. Verwenden von nicht verwaltetem Code aus verwaltetem Code
- 13. Kann nicht mit Jackson arbeiten
- 14. C# nicht Bindung arbeiten
- 15. Warum nicht imagick arbeiten?
- 16. Directx 12 - Adapter nicht
- 17. wglCreateContext in C# fehlgeschlagen, aber nicht in verwaltetem C++
- 18. In C#, warum nicht?: Operator arbeiten mit Lambda oder Methodengruppen?
- 19. Verwenden Sie C# -Eigenschaften in nicht verwaltetem C++ - Code
- 20. Warum elision nicht mit std :: move arbeiten?
- 21. Warum nicht add_EventName mit Timer arbeiten?
- 22. Was ist das beste Komponententest-Tool für eine Mischung aus verwaltetem und nicht verwaltetem C++?
- 23. Kann pybindgen nicht mit gccxml arbeiten
- 24. Kann nicht bekommen SAFEARRAY mit Interop arbeiten
- 25. Reverse PInvoke von nativem C++
- 26. Kann jdbcRealm nicht arbeiten
- 27. Kann ChromeSpracheSynthese nicht offline arbeiten?
- 28. Kann nicht arbeiten history.forward();
- 29. kann Foundation-Menü nicht mit reactJS arbeiten
- 30. HorizontalScrollView kann nicht mit Android arbeiten: WeightSum?
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 –