从本机调用 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# 以获取字符串长度,在 C++ 上分配该字符串,将其传递给 C# 并使用不安全代码使其填充缓冲区。但这又脏又不切实际,所以我不会那样做。
使 C# 函数调用 C++,将结果存储在某处,并且在本机代码中,一旦对 C# 的调用已 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)
我整天都被困在这个问题上,但似乎不可能,至少使用 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# 以获取字符串长度,在 C++ 上分配该字符串,将其传递给 C# 并使用不安全代码使其填充缓冲区。但这又脏又不切实际,所以我不会那样做。
使 C# 函数调用 C++,将结果存储在某处,并且在本机代码中,一旦对 C# 的调用已 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)