从 C# 调用 wstring C++ 方法
Call a wstring C++ method from C#
我正在使用 C# 代码,需要在 C++ dll 中调用此方法。
static std::wstring DecryptData(const std::wstring& strKey);
我读过很多东西,我最好的猜测是传递一些对两种语言都更容易阅读的东西,比如字符数组甚至字节数组,然后在 C++ 中构建 wstring,然后在 C# 中构建字符串.
有人这样做了吗?
编辑:
我阅读了链接主题,但 none 的答案对我有帮助:
使用 const
没有帮助。
这是我现在拥有的:
C#
[DllImport(DLL_PATH, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static extern string DecryptData([MarshalAs(UnmanagedType.LPWStr)]string strKey);
C++
extern "C" __declspec(dllexport) const std::wstring DecryptData(const std::wstring& strKey) {
return WlanHelper::CWirelessHelper::DecryptData(strKey);
}
这给了我一个 PInvokeStackImbalance =/
您可能会发现 this question and this question 相关。有两个问题:
- P/Invoke 本身不封送
std::string
/std::wstring
和
- 可能存在内存寿命问题(取决于
CWirelessHelper::DecryptData
的实施)。
一种方法是将字符串复制到使用 CoTaskMemAlloc
(the framework will handle the string conversion and free the allocated memory) 分配的纯 wchar_t*
缓冲区。
在非托管端,代码变为:
extern "C" __declspec(dllexport) const wchar_t* DecryptData( wchar_t* strKey) {
std::wstring retstr = WlanHelper::CWirelessHelper::DecryptData(std::wstring(strKey));
const wchar_t* ret = retstr.c_str();
size_t bufsize = wcslen(ret) + 1;
wchar_t* buffer = (wchar_t*)CoTaskMemAlloc(bufsize * sizeof(wchar_t));
wcscpy_s(buffer, bufsize, ret);
return buffer;
}
在托管方面:
[DllImport(DLL_PATH,
CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.Cdecl)]
static extern string DecryptData(string strKey);
我正在使用 C# 代码,需要在 C++ dll 中调用此方法。
static std::wstring DecryptData(const std::wstring& strKey);
我读过很多东西,我最好的猜测是传递一些对两种语言都更容易阅读的东西,比如字符数组甚至字节数组,然后在 C++ 中构建 wstring,然后在 C# 中构建字符串.
有人这样做了吗?
编辑:
我阅读了链接主题,但 none 的答案对我有帮助:
使用 const
没有帮助。
这是我现在拥有的: C#
[DllImport(DLL_PATH, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static extern string DecryptData([MarshalAs(UnmanagedType.LPWStr)]string strKey);
C++
extern "C" __declspec(dllexport) const std::wstring DecryptData(const std::wstring& strKey) {
return WlanHelper::CWirelessHelper::DecryptData(strKey);
}
这给了我一个 PInvokeStackImbalance =/
您可能会发现 this question and this question 相关。有两个问题:
- P/Invoke 本身不封送
std::string
/std::wstring
和 - 可能存在内存寿命问题(取决于
CWirelessHelper::DecryptData
的实施)。
一种方法是将字符串复制到使用 CoTaskMemAlloc
(the framework will handle the string conversion and free the allocated memory) 分配的纯 wchar_t*
缓冲区。
在非托管端,代码变为:
extern "C" __declspec(dllexport) const wchar_t* DecryptData( wchar_t* strKey) {
std::wstring retstr = WlanHelper::CWirelessHelper::DecryptData(std::wstring(strKey));
const wchar_t* ret = retstr.c_str();
size_t bufsize = wcslen(ret) + 1;
wchar_t* buffer = (wchar_t*)CoTaskMemAlloc(bufsize * sizeof(wchar_t));
wcscpy_s(buffer, bufsize, ret);
return buffer;
}
在托管方面:
[DllImport(DLL_PATH,
CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.Cdecl)]
static extern string DecryptData(string strKey);