2015-12-30 30 views
0

我一直在這一整天陷入困境,但似乎至少使用緊湊框架從本機代碼調用一個C#方法,該方法的代碼爲返回一個字符串。從本地調用C#以檢索字符串

我見過有關從本地代碼傳遞數據到本地代碼的幾個例子,但沒有一個例子使用返回值。

我想要做的是有一個C#函數,返回一個字符串,這樣我就可以將它從C#拉回到C++,即從C++調用C#而不是其他方式。

String GetSomeString() { return "foo"; } // C# 

並調用來自本地代碼此功能這將有這樣的簽名:

typedef const wchar_t * (__stdcall * native_func_t)(); 

這裏的問題是,它是行不通的。當我將委託傳遞給本機代碼時,會引發NotSupportedException。但是,如果我通過void替換字符串返回類型,它完美地工作。

其他的解決方案是:

  • 調用C#從C++來獲取字符串長度,分配在C++該字符串,將它傳遞給C#,使其使用不安全的代碼填充緩衝區。但這是骯髒和不切實際的,所以我不會那樣做。

  • 使C#函數調用C++,該C++將結果存儲在某處,並且在本地代碼中,一旦C#調用返回,就會在存儲結果的位置檢索結果。但這也是非常醜陋和不切實際的。

您是否看到另一種方式來做到這一點?

+0

是怎樣的C++二進制文件加載C#組件?這是來自回調,並且過程本身是託管代碼? – ctacke

+0

我會使用COM BSTR。也就是說,在C++端分配是一個不錯的選擇。沒有對這個主題的更深入的理解,你不應該這樣說。 –

+0

@ctake其實它是一個Windows窗體應用程序。 C#處理GUI,但所有其餘工作都由本機代碼完成。 – Virus721

回答

-1

事實上,從C++調用C#函數似乎沒有任何返回值。 任何返回類型高於void將導致引發NotSupportedException。

我沒有在MSDN文檔中找到這方面的證據,但經過大量測試,似乎它是如何工作的,至少在緊湊框架

0

在stackoverflow和其他方面已經問過這個問題。

一個stackoverflow帖子在Calling a C# function from a C++ DLL

鏈接的解決方案使用CallingConvention.StdCall它提供CF但是你可以使用CallingConvention.WinApi代替它轉換按照本網站 https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention%28v=vs.90%29.aspx

您也可以使用其他的互操作技術,如自定義消息CallingConvention.StdCall (SendMessage)和窗體句柄之間。

爲了揭露管理組件以C++使用COM(見https://msdn.microsoft.com/en-us/library/zsfww439%28v=vs.80%29.aspx