我正在尝试使用平台调用将字符串从 C# 传递到 C++。
C++代码:
#include<string> using namespace std; extern "C" { double __declspec(dllexport) Add(double a, double b) { return a + b; } string __declspec(dllexport) ToUpper(string s) { string tmp = s; for(string::iterator it = tmp.begin();it != tmp.end();it++) (*it)-=32; return tmp; } }
C#代码:
[DllImport("TestDll.dll", CharSet = CharSet.Ansi, CallingConvention =CallingConvention.Cdecl)] public static extern string ToUpper(string s); static void Main(string[] args) { string s = "hello"; Console.WriteLine(Add(a,b)); Console.WriteLine(ToUpper(s)); }
我收到一个 SEHException。像这样使用 std::string
是不可能的吗?我应该改用 char*
吗?
最佳答案
正确的决定
C# 端:
[DllImport("CppDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr GetString(string s);
public string GetString_(string s)
{
var ptr = GetString(s);
var answerStr = Marshal.PtrToStringAnsi(ptr);
return answerStr;
}
C++ 方面:
extern "C" __declspec(dllexport) const char* GetString(char* s)
{
string workStr(s);
int lenStr = workStr.length() + 1;
char* answer = new char[lenStr];
const char * constAnswer = new char[lenStr];
strcpy(answer, workStr.c_str());
constAnswer = answer;
return constAnswer;
}
并在cpp项目的设置中禁用/sdl-。
关于c# - Dllimport 将字符串从 C# 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13514560/