我一整天都在坚持这个问题,但至少使用紧凑框架似乎不可能从 native 代码调用返回的 C# 方法 一个字符串。
我见过几个关于在 native 代码之间传递数据的示例,但没有一个示例使用返回值。
我想要做的是有一个 C# 函数返回一个字符串,这样我就可以将它从 C# 拉回 C++,即从 C++ 调用 C#,而不是相反。
String GetSomeString() { return "foo"; } // C#
并从 native 代码调用此函数,其签名如下:
typedef const wchar_t * (__stdcall * native_func_t)();
问题是它根本不起作用。当我将委托(delegate)传递给 native 代码时,会引发 NotSupportedException。但是,如果我用 void 替换 String 返回类型,它就可以完美工作。
其他解决方案是:
从 C++ 调用 C# 以获取字符串长度,在 C++ 上分配该字符串,将其传递给 C# 并使用不安全代码使其填充缓冲区。但这既肮脏又不切实际,所以我不会这样做。
使 C# 函数调用 C++,将结果存储在某处,并在 native 代码中,在对 C# 的调用返回后检索结果存储的位置。但这也非常丑陋且不切实际。
请问您还有其他方法吗?
最佳答案
这个问题已经在 stackoverflow 和其他方面提出过。
一个 stackoverflow 帖子位于 Calling a C# function from a C++ DLL 。
链接的解决方案使用 CF 中提供的 CallingConvention.StdCall,但您可以使用 CallingConvention.WinApi 代替,根据此站点,它会转换为 CallingConvention.StdCall https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention%28v=vs.90%29.aspx
您还可以使用其他互操作技术,例如窗口和表单句柄之间的自定义消息 (SendMessage)。
要将托管组件公开给 C++,请使用 COM(请参阅 https://msdn.microsoft.com/en-us/library/zsfww439%28v=vs.80%29.aspx)
关于c# - 从 native 调用 C# 来检索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531974/