我一直在使用C#一年,我知道您可以通過interop/PInvoke從C#訪問本機代碼。 我剛開始學習DirectX,並得知在c#中使用DirectX的幾種方法之一是使用類似SharpDX的東西,它是用C++而不是C#編寫的包裝。我的問題是 ;因爲C#支持互操作性並允許程序員訪問本機dlls/com對象。當涉及到DirectX dlls/coms時,這種支持是無效的。我很困惑爲什麼C#PInvoke無法使用非託管DirectX
3
A
回答
3
這是不正確的。 SharpDX是一個純粹的C#包裝程序,它通過對.NET程序集進行IL字節碼後處理來使用一些C++/CLI技術。有關更多詳細信息,請參閱原始post。 (在「如何避免在C#中使用C++/CLI」一節)。爲了在C#中實現C++接口回調,你可以看看這個post。
即使沒有calli
IL字節碼指令,完全可以使用非託管代理開發COM對象的完整包裝(通過Marshal.GetFunctionPointerForDelegate
)。您也可以在C#中使用常規的COM interop。另一方面,如果C++對象不提供COM接口(即只有純虛擬方法),則需要簡化的C++包裝器訪問或處理C++對象的導出調整名稱(即,afaik,不標準化)
2
PInvoke是相當有限,適用於C風格的API,如Windows API。 有非常小的類型,可以封送。
COM互操作存在類似的限制。
DirectX API主要是C++的API。你不能在邊界之間傳遞C++類 - 這很令人頭疼。但是C++/CLI是一種可行的方式 - 它可以幫助您在託管環境和本地環境之間建立某種橋樑。
相關問題
- 1. DirectX託管或非託管?
- 2. 使用pinvoke從C#調用非託管C++代碼
- 3. 追蹤通過託管DirectX分配的非託管DirectX對象
- 4. 什麼是「託管/非託管類型組合無效」。意思?
- 5. DirectX託管池
- 6. 託管DirectX
- 7. 將非託管結構變爲使用c託管代碼#
- 8. 託管DirectX作爲起點
- 9. 在c#中的pInvoke(託管代碼)
- 10. 在非託管C++ dll中使用託管c#dll
- 11. 卡住調用從非託管C++調用託管CLI方法
- 12. 無法創建使用託管C++
- 13. 使用PInvoke時,爲什麼使用__stdcall?
- 14. 爲什麼WPF設計器無法加載調用非託管DLL的庫?
- 15. 什麼是「託管」和「非託管」可用性集?
- 16. 將非託管directX嵌入到C#表格
- 17. Visual Studio 2010,C#和DirectX託管代碼
- 18. 旋轉文本 - 託管DirectX(C#)
- 19. C++託管和非託管靜態庫
- 20. 混合託管/非託管C++?
- 21. 託管和非託管C++和Boost
- 22. Gdiplus在C++託管或非託管?
- 23. C++託管到非託管轉換
- 24. 無法將指針指向非非託管類型int * C#
- 25. 使用VS2010創建C++非託管DLL
- 26. SafeArrayTypeMismatchException嘗試使用非託管C++ DLL
- 27. 託管的PInvoke簽名不匹配的非託管的目標籤名
- 28. 爲Win32和WinCE開發非託管C++ DLL的最佳方法是什麼?
- 29. 在託管環境中使用非託管線程有什麼缺點?
- 30. 什麼是C++/CLI中的託管對象和非託管對象?
謝謝,這非常有見地。我想在不學習CLR/IL的情況下學習C#是類似於學習ASP.Net的人,然後假設他/她知道Web如何工作。我只是驚訝於那裏的C#程序員的數量(主要在遊戲開發論壇中),他們聲稱除了通過slimDX或SharpDX之外,沒有辦法使用DirectX與C# –