c# - 将 Unicode 字符串从 C# 发送到 C++,在一个项目中工作,而不是在另一个项目中
问题描述
我在 VS2017 中构建了一个包含两个项目的测试工具解决方案,一个是我发送 unicode 字符串的 C# 项目,一个是我接收它并在 MessageBox 中显示的 C++ DLL。
我的 C# 代码是:
[DllImport(@"TestDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern void SendString([MarshalAs(UnmanagedType.LPWStr)] string str);
private void Button_Click(object sender, RoutedEventArgs e)
{
SendString("Test2 String ☻我是美国人");
}
我的 C++ 代码是:
__declspec(dllexport) bool __stdcall SendString(wchar_t *IncomingPath)
{
MessageBoxW(
NULL,
IncomingPath,
L"Header",
MB_ICONINFORMATION
);
return true;
}
这可以按预期工作,输出如下:
伟大的。因此,我将代码移植到一个更大的解决方案中,再次使用与描述相同的小型 C# 测试项目,以及一个更大的现有 C++ 项目,其中我需要包含相同的字符串传递功能。
这次我的 C# 代码非常相似:
[DllImport(@"my.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern void ProcessOneFile([MarshalAs(UnmanagedType.LPWStr)] string str);
private void Button_Click(object sender, RoutedEventArgs e)
{
ProcessOneFile("Test2 String ☻我是美国人");
}
和 C++ 代码也基本相同。
__declspec(dllexport) cv::Mat __stdcall ProcessOneFile(wchar_t *FullFilePath) {
MessageBoxW(
NULL,
FullFilePath ,
L"Headervv",
MB_ICONINFORMATION
);
}
然而我得到了这个:
为了测试,我将 C++ 项目从 DLL 更改为 exe,并在本地调用 ProcessOneFile 函数,在同一 C++ 文件中使用 main() 中的以下代码:
wchar_t *temp = L"C:/Z2C6BC1C克 - Copy.jpg";
ProcessOneFile(temp);
我得到:
因此,数据似乎无法在从 C# 到 C++ 的边界传输中幸存下来。
两种解决方案都在同一台 PC 上运行,都在同一个 Visual Studio (2017) 中编译,这两个 c++ 项目都将属性 -> 常规 -> 字符集设置为“使用 Unicode 字符集”。
一定有一些与项目相关的东西导致了这种情况,任何帮助都将不胜感激。我根本不是 C++ 人,我试图从 Github 上的代码中获取我需要的功能。
感谢您的任何建议。
解决方案
首先停止cv::Mat
从你的函数返回。导出 aclass
从来都不是可取的。此外,OpenCV
cv::Mat
没有被导出。
此外,为避免名称混淆,请在函数定义前加上extern "C"
:
extern "C" __declspec(dllexport) void __stdcall ProcessOneFile(wchar_t *FullFilePath)
推荐阅读
- java - NamedParameterJdbcTemplate 不支持 SUM()?
- list - Haskell中整数列表的递归排序算法
- java - 在我使用 for 循环填充数组后,数组出现了空值
- c++ - 如何解决cpp文件的这个错误
- android - 如何使用 gpio-keys 中断从睡眠中唤醒系统
- javascript - 每个类实例的闭包函数 (JavaScript)
- asp.net-mvc - 在 URL 中使用点
- azure - 在 Azure 函数上以分布式模式运行 Locust
- php - 在 Woocommerce 商店中禁用特定产品类别的链接
- python - 如何对 Python 代码源的反汇编表示进行计时