从本机调用 C# 以检索字符串

Call C# from native to retrieve a String

我整天都被困在这个问题上,但似乎不可能,至少使用 compact 框架,从本机代码调用 C# 方法returns 一个字符串。

我看过几个关于在本机代码之间传递数据的示例,但是 none 个示例使用的是 return 值。

我想要做的是有一个 C# 函数,它 return 是一个字符串 ,这样我就可以将它从 C# 拉回 C++,即调用 C#来自 C++ 而不是其他方式。

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

并从具有如下签名的本机代码调用此函数:

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

问题在于它根本不起作用。当我将委托传递给本机代码时抛出 NotSupportedException。但是,如果我用 void 替换 String return 类型,它就可以完美地工作。

其他解决方案是:

请问您还有其他方法吗?

实际上,当从 C++ 调用时,似乎没有 C# 函数可以 return 某些东西。 除 void 之外的任何 return 类型都将导致抛出 NotSupportedException。

我没有在 MSDN 文档中找到这方面的证据,但经过大量测试后,它似乎是这样工作的,至少对于 compact 框架.

这个问题已经在 Whosebug 和其他方面被问过了。

一个 Whosebug post 在 Calling a C# function from a C++ DLL

链接的解决方案使用 CallingConvention.StdCall,它在 CF 中可用,但您可以使用 CallingConvention.WinApi,根据此站点转换为 CallingConvention.StdCall https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention%28v=vs.90%29.aspx

您还可以使用其他互操作技术,例如 windows 和表单句柄之间的自定义消息 (SendMessage)。

要将托管组件公开给 C++,请使用 COM(请参阅 https://msdn.microsoft.com/en-us/library/zsfww439%28v=vs.80%29.aspx