2016-04-11 33 views
3

我一直在使用C#一年,我知道您可以通過interop/PInvoke從C#訪問本機代碼。 我剛開始學習DirectX,並得知在c#中使用DirectX的幾種方法之一是使用類似SharpDX的東西,它是用C++而不是C#編寫的包裝。我的問題是 ;因爲C#支持互操作性並允許程序員訪問本機dlls/com對象。當涉及到DirectX dlls/coms時,這種支持是無效的。我很困惑爲什麼C#PInvoke無法使用非託管DirectX

回答

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,不標準化)

+0

謝謝,這非常有見地。我想在不學習CLR/IL的情況下學習C#是類似於學習ASP.Net的人,然後假設他/她知道Web如何工作。我只是驚訝於那裏的C#程序員的數量(主要在遊戲開發論壇中),他們聲稱除了通過slimDX或SharpDX之外,沒有辦法使用DirectX與C# –

2

PInvoke是相當有限,適用於C風格的API,如Windows API。 有非常小的類型,可以封送。
COM互操作存在類似的限制。

DirectX API主要是C++的API。你不能在邊界之間傳遞C++類 - 這很令人頭疼。但是C++/CLI是一種可行的方式 - 它可以幫助您在託管環境和本地環境之間建立某種橋樑。