c# - 从 native 调用 C# 来检索字符串

标签 c# c++ c compact-framework pinvoke

我一整天都在坚持这个问题,但至少使用紧凑框架似乎不可能从 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/

相关文章:

c++ - 为什么这个 C++ 程序会出现段错误?

python - 如何在 C 扩展模块中创建并返回函数对象?

c - 为什么信号处理程序进入无限循环? - SIGSEGV

c - 使用 -std=c99 编译时,我需要使用 -pedantic 还是 -ansi?

c# - 获取书签处的文本

c# - 获得锁后枚举器线程安全吗?

c# - 如何将 xDocument 自动转换为类

c++ - 一个应用程序可以运行另一个应用程序的代码吗?

c++ - 当我需要通过指针传递时(而不是通过引用传递)

c# - 如何在将数据写入 Excel 时制作正确的日期格式