C# 从C调用WSc++ C++方法 我使用C代码,需要在C++ DLL中调用这个方法。 static std::wstring DecryptData(const std::wstring& strKey); 我已经读过很多东西,我最好的猜测是通过两种语言更容易阅读的东西,比如字符数组甚至字节数组,然后在C++中构建Wstring和C中的字符串。

C# 从C调用WSc++ C++方法 我使用C代码,需要在C++ DLL中调用这个方法。 static std::wstring DecryptData(const std::wstring& strKey); 我已经读过很多东西,我最好的猜测是通过两种语言更容易阅读的东西,比如字符数组甚至字节数组,然后在C++中构建Wstring和C中的字符串。,c#,c++,wstring,C#,C++,Wstring,已经有人这么做了吗 编辑: 我阅读了链接主题,但没有一个答案对我有帮助: 使用const没有帮助 这就是我现在拥有的: C C++ 这给了我一个pinvokestackbalancer=/你可能会发现并与之相关。有两个问题: P/Invoke不会本机封送std::string/std::wstring,并且 可能的内存生存期问题取决于cWirelessShelper::DecryptData的实现。 一种方法是将字符串复制到使用CoTaskMemAlloc分配的普通wchar_t*缓冲区 在非托

已经有人这么做了吗

编辑:

我阅读了链接主题,但没有一个答案对我有帮助: 使用const没有帮助

这就是我现在拥有的: C

C++

这给了我一个pinvokestackbalancer=/

你可能会发现并与之相关。有两个问题:

P/Invoke不会本机封送std::string/std::wstring,并且 可能的内存生存期问题取决于cWirelessShelper::DecryptData的实现。 一种方法是将字符串复制到使用CoTaskMemAlloc分配的普通wchar_t*缓冲区

在非托管端,代码变为:

外部C_uudeclspecdllexport const wchar_t*解密数据wchar_t*strKey{ std::wstring retstr=WlanHelper::cwirelessshelper::DecryptDatastd::wstringstrKey; 常量wchar_t*ret=retstr.c_str; 尺寸=wcslenret+1; wchar_t*buffer=wchar_t*CoTaskMemAllocbufsize*sizeofwchar\u t; wcscpy_sbuffer、bufsize、ret; 返回缓冲区; } 在管理方面:

[DllImportDLL_路径, CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl] 静态外部字符串解密数据字符串strKey; 你可能会发现并与之相关。有两个问题:

P/Invoke不会本机封送std::string/std::wstring,并且 可能的内存生存期问题取决于cWirelessShelper::DecryptData的实现。 一种方法是将字符串复制到使用CoTaskMemAlloc分配的普通wchar_t*缓冲区

在非托管端,代码变为:

外部C_uudeclspecdllexport const wchar_t*解密数据wchar_t*strKey{ std::wstring retstr=WlanHelper::cwirelessshelper::DecryptDatastd::wstringstrKey; 常量wchar_t*ret=retstr.c_str; 尺寸=wcslenret+1; wchar_t*buffer=wchar_t*CoTaskMemAllocbufsize*sizeofwchar\u t; wcscpy_sbuffer、bufsize、ret; 返回缓冲区; } 在管理方面:

[DllImportDLL_路径, CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl] 静态外部字符串解密数据字符串strKey;
我的问题的后半部分很快就解决了。但是我还需要输入一个C字符串,并且该方法需要一个wstring atm。[DllImportpath.dll,CharSet=CharSet.Unicode]静态外部字符串解密数据[MarshalAsUnmanagedType.LPWStr]字符串strKey@如果把DLL作为参考添加,你有选择改变C++函数的可能性吗?这个问题的副本可以解决我的问题的后半部分。但是我还需要输入一个C字符串,并且该方法需要一个wstring atm。[DllImportpath.dll,CharSet=CharSet.Unicode]静态外部字符串解密数据[MarshalAsUnmanagedType.LPWStr]字符串strKey@最好把DLL作为参考,你有选择改变C++函数吗?
 [DllImport(DLL_PATH, CharSet = CharSet.Unicode)]
        [return: MarshalAs(UnmanagedType.LPWStr)]
        public static extern string DecryptData([MarshalAs(UnmanagedType.LPWStr)]string strKey);
extern "C" __declspec(dllexport) const std::wstring DecryptData(const std::wstring& strKey) {
    return WlanHelper::CWirelessHelper::DecryptData(strKey);
}