2014-01-10 33 views
0

我是C#的noob,我已經在網上搜索過。無論如何,我仍然不確定這一點,我沒有完全控制我必須實現的代碼,這就是爲什麼我想確保我不需要製作任何DLL。我有一個C++文件和一個方法,我想從C#代碼調用這個方法。我只是添加了「extern C」的功能。從C#調用C++代碼而不創建dll?

當我只是將.h和.cpp文件添加到C#項目中時,它們不會被檢測到。當然,當我嘗試添加它作爲參考時,它不起作用。

那麼,我絕對必須做一個DLL?

+0

爲什麼不能組裝(dll)?任何具體原因? –

+0

不是。但我最好確定沒有別的辦法 –

+0

而且因爲不是屬於我的,所以我最好儘量少碰它 –

回答

2

你從C#訪問C++代碼選項:使用對

  • 編譯C++作爲非託管的DLL和訪問/調用。這要求使用C風格API公開C++代碼。
  • 將C++編譯爲非託管DLL並使用COM進行訪問。這要求你將C++包裝爲COM對象。
  • 將C++編譯爲混合/模式C++/CLI程序集,並將程序集作爲託管引用進行訪問。這要求您將原始C++作爲託管C++引用類進行封裝。

所有這些選項,必要的,都涉及創建另一個模塊/程序集。您不能將C++代碼直接鏈接到C#程序集中。

+0

值得澄清的是第一個選項真的只在調用C API時才起作用,而且第二個選項需要你的C++代碼寫成COM對象 – jalf

+0

@jalf我已經爲所有選項的這些效果添加了單詞 –

0

您可能想嘗試使用PInvoke Interop Assistant來生成通過平臺調用與DLL進行交互所必需的C#。請注意,儘管如此,YMMV並不完美。

另一種方法是,如果您有足夠的知識和耐心,可以從您的本機C++ DLL中創建一個COM組件,並通過使用類型庫導入程序創建託管包裝來從C#中使用該組件。

0

您將無法與.cpp/.h文件交互,因爲您至少需要C#的二進制對象(程序集)才能與C#進行交互,並且C#不會從.cpp/.h生成任何二進制文件。這是關於添加這些文件作爲項目的參考的主題。

至於你無法控制代碼的說法 - 不要將DLL從實際的.cpp/.h中取出,而是讓你自己的包含對象的瘦DLL包括頭文件,調用你要調用的任何方法,並鏈接到相應的.o文件或.lib或任何你擁有的。如果界面發生變化,你只需要改變你的東西包裝,這應該很容易。