您可以創建一個在CLR上運行的VC++ Windows Forms項目,這本質上是一個用C++編寫的.NET應用程序。你可以直接從這樣的項目使用非託管C++庫嗎?這是否意味着庫必須在.NET下編譯和運行?或者你必須爲這樣的庫編寫CLR wrapper classes,並且只有那些可用於CLR應用程序?您可以在C++/CLI WinForms應用程序中本地使用C++庫嗎?
回答
是的。這裏有一些指南。混合CLI/C++和本地代碼。你不需要一個包裝器來在CLI/C++中使用它們。實際上,您使用CLI/C++和本機代碼來創建包裝。
http://www.technical-recipes.com/2012/mixing-managed-and-native-types-in-c-cli/
http://www.codeproject.com/Articles/35041/Mixing-NET-and-native-code
如果你實際上是試圖使包裝在C#中使用,它應該是這個樣子:
#include "NativeClass.h"
public ref class NativeClassWrapper {
NativeClass* m_nativeClass;
public:
NativeClassWrapper() { m_nativeClass = new NativeClass(); }
~NativeClassWrapper() { delete m_nativeClass; }
void Method() {
m_nativeClass->Method();
}
protected:
// an explicit Finalize() method—as a failsafe
!NativeClassWrapper() { delete m_nativeClass; }
};
使用智能指針庫使管理本地(而不是垃圾回收)對象的分配變得更加簡單CTS,這是相當困難的例外,多次調用Dispose()
的存在,忘記打電話Dispose()
等
這裏的Dr_Asik的例子,改寫使用a smart pointer I wrote:
#include "clr_scoped_ptr.h"
#include "NativeClass.h"
public ref class NativeClassWrapper {
clr_scoped_ptr<NativeClass> m_nativeClass;
public:
NativeClassWrapper() m_nativeClass(new NativeClass()) {}
// auto-generated destructor is correct
// auto-generated finalizer is correct
void Method() {
m_nativeClass->Method();
}
};
進行字符串轉換,使用marshal_as
Microsoft爲此目的提供的類。檢查出ildjarn的答案在這裏:C++/CLI String Conversions
感謝您的明智回答,本,我接受它,直到有人提出更好的答案。你似乎是一個C++專家,由你的SO代表來評判這件事(金C++徽章,有多少人擁有這些徽章?!),所以我相信你確切地知道你在這裏談論的是什麼。與我自己一樣,一個初學者。呃..有一天! – 2013-03-19 17:34:21
@Geotarget:SO代表和徽章不是最可靠的指標,但我喜歡認爲我給出了很好的答案。繼續練習,你也會發展專業知識。 – 2013-03-19 17:35:23
你能告訴我一些關於將C#數據類型轉換爲C++並返回的信息嗎?只是基本的字符串和整數/雙打。我在這裏獲得了一些字符串參考代碼:http://www.codeproject.com/Articles/35041/Mixing-NET-and-native-code但是一切仍然非常片斷。 – 2013-03-19 17:35:28
- 1. 在iOS應用程序中可以在本地使用mongoDB嗎?
- 2. WPF和WinForms可以在應用程序中混合使用嗎?
- 3. CSS可以在VB WinForms應用程序中使用嗎?
- 4. 我可以在CAB WinForms應用程序中託管ASP.NET應用程序嗎?
- 5. 在C++/CLI(WinForms)應用程序中使用C#WinForms控件
- 6. 我可以在C程序中使用C++庫嗎?
- 7. 我可以在C++ 11客戶端應用程序庫中使用C++ 14嗎?
- 8. 你可以在Dart應用程序中使用Java庫嗎?
- 9. 您可以在AMP服務器中使用C#庫嗎?
- 10. 您可以使用JMeter測試Siebel應用程序嗎?
- 11. 您可以使用openshift來部署非Web應用程序嗎?
- 12. 您可以使用帶電話應用程序的Selenium嗎?
- 13. 您可以使用NSPasteBoard粘貼到其他應用程序嗎?
- 14. 您可以在Java EE Web應用程序中實現Vue.js嗎?
- 15. 您可以在Silverlight中構建整個應用程序嗎?
- 16. 您可以在IIS中託管ServiceStack Web應用程序嗎?
- 17. 您可以在雲中運行winform應用程序嗎?
- 18. 構建iPhone應用程序時,您可以使用CS5訪問地址簿嗎?
- 19. 在C#winforms應用程序中使用文本框過濾TreeView
- 20. 我可以在Palm OS應用程序中使用標準C庫嗎?
- 21. 您可以將多個本地引擎添加到Rails 3應用程序嗎?
- 22. 本地化將從3方應用程序中使用的WinForms
- 23. 可以在ubuntu上運行winforms應用程序嗎?
- 24. 您可以在WPF應用程序中使用sketchflow控件/樣式嗎?
- 25. 您可以在Sinatra應用程序中使用Slim流式傳輸HTML嗎?
- 26. 您可以使用Dreamweaver在appcelerator中開發移動應用程序嗎?
- 27. 您可以在付費IOS應用程序中使用Google圖表嗎?
- 28. 您可以在VB.NET桌面應用程序中使用JIRA的SOAP API嗎?
- 29. 我可以在JSP中調用本地用戶程序嗎?
- 30. 我可以使用Paint.NET API將它嵌入到Winforms應用程序中嗎?
是的,這實際上是你如何製作包裝。 :] – Corylulu 2013-03-19 17:11:36
這是如何創建一個包裝器,但如果您在C++中使用它,則不需要。如果你想把它帶到C#,那麼是的,這是你需要的。我注意到你標記了C#,所以也許這就是你想要做的。 – Corylulu 2013-03-19 17:14:45
更好的主意:使用一個工作智能指針,如[我寫的這一個](http://codereview.stackexchange.com/q/1695/2150),而不是複製每個包裝類中的內存清理代碼。例如,這個答案有內存泄漏。 – 2013-03-19 17:19:17