我有一個接口,我在C++中定義了現在需要在C#中實現的接口。什麼是最好的方式去做這件事?我不想在我的界面定義中使用COM。我現在解決這個問題的方法是有兩個接口定義,一個用C++和一個用C#。然後我將C#接口公開爲COM服務器。這是我用C++編寫的應用程序可以調用到C#中。無論如何,我可以避免必須在C++和C#中定義我的實現嗎?在C++中定義需要用C#和C++實現的接口
回答
如果您願意爲您的託管代碼而不是C#使用C++/CLI,那麼您可以直接通過頭文件使用本地C++接口定義。這將是多麼容易取決於你的界面到底是什麼 - 最簡單的情況是你可以從C使用的東西。
看看Marcus Heege的Expert C++/CLI: .NET for Visual C++ Programmers,瞭解很多關於混合原生和託管C++的有用信息在.NET中。
爲什麼你不想使用COM?
這將是我的建議。 COM interop對我來說工作得非常好,我在C#中使用了COM對象和接口(只需引用COM對象並自動創建運行時可調用的包裝器)。反過來,將C#類標記爲「註冊COM互操作」也是如此。
在C++中編寫接口並使用宏使其看起來像UNIX上的標準cpp頭文件,並且像windows上的IDL文件(如果這樣做不起作用,則可以始終編寫一個python/ruby腳本來生成來自C++頭文件的IDL)。
編譯IDL以生成一個typelib。使用TypeLib導入器爲C#生成接口定義並在其中實現接口。
在IDL中編寫接口並使用工具將接口編譯爲目標語言。在查看涉及跨語言接口的CORBA時,您可能會發現這些指針。
/艾倫
你沒有提到你正在使用.NET,但東西是我在使用Visual Studio .NET 2003的工作的版本是提供各地的小突起實現的薄C#包裝真正的C++類:
public __gc class MyClass_Net {
public:
MyClass_Net()
:native_ptr_(new MyClass())
{
}
~MyClass_Net()
{
delete native_ptr_;
}
private:
MyClass __nogc *native_ptr_;
};
顯然,人們會更喜歡使用升壓shared_ptr的有,但我從來沒有讓他們與V.NET 2003發揮很好...
方法簡單地轉發到底層C++方法通過指針。方法參數可能必須轉換。例如,要調用一個接受字符串的C++方法,C#方法可能需要一個System.String(System :: String in Managed C++)。你必須使用System :: Runtime :: InteropServices :: Marshal :: StringToHGlobalAnsi()來做到這一點。
這種方法的一個好處是,因爲Managed C++是一種.NET語言,您可以將訪問器作爲屬性(__property)公開。你甚至可以公開屬性,就像在C#中一樣。
另一種方法是使用'扁平',C風格的API。您不妨使用extern "C"
來防止意外超載。使用一個DEF文件明確命名導出的函數,所以它們絕對不是以任何方式裝飾的(C++函數在導出表中用參數類型的編碼進行「裝飾」)。
在x86上,請小心調用約定。可能會明確聲明使用__stdcall
或__cdecl
。由於P/Invoke主要用於調用Windows API,因此默認爲StdCall,但C和C++默認爲cdecl,因爲它支持可變參數。
我最近將COM接口IRapiStream
封裝在一個扁平的C接口中,因爲.NET似乎試圖將IStream轉換成存儲器,該存儲器因錯誤STG_E_UNIMPLEMENTEDFUNCTION
而失敗。
Swig是用C#等其他語言包裝C++類的好工具。
- 1. 在C++中實現接口
- 2. 在C++中實現接口?
- 3. Objective-c接口和實現
- 4. C#接口實現
- 5. 接口實現C#
- 6. 實現接口C#
- 7. 實現在C++接口
- 8. 在c#中實現通用接口#
- 9. 如何在c#中定義接口的默認實現?
- 10. C#使用泛型和接口實現
- 11. C++/CLI實現一個C#接口
- 12. Objective-C類實現C++接口
- 13. 組件A1中的C類實現了組件A2的接口。當使用C,需要引用A1和A2
- 14. C#實現接口「where TEntity:class」
- 15. C#接口屬性實現
- 16. 實現ISupportIncrementalLoading接口 - UWP - C#
- 17. 在C#中實現多個接口
- 18. 在VB類中實現C#接口
- 19. C++接口聲明/定義和用法
- 20. C#實現和轉換接口
- 21. 在c#接口實現枚舉和接口的方法簽名
- 22. 在c中的定義/實現問題#
- 23. C#檢查通用接口的實現
- 24. C#:接口和摘要使實現和覆蓋
- 25. C和C++接口
- 26. C#接口 - 僅實現其他接口中的接口
- 27. 錯誤:在C++中實現接口模式時未定義的typeinfo引用
- 28. 在C++中使用C#接口或在C#中使用C++接口
- 29. 需要一個接口的c#方法?
- 30. 在C#中實現TCP/IP JSONRPC連接 - 需要設計建議
還想補充一點,Nishant Sivakumar在C++/CLI中的作用是瞭解如何將C++連接到C#的一個很好的資源。 – Juba 2011-02-04 17:39:03