我在 C# 中有以下代码:
[DllImport("ClassLibrary2.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void GetString(StringBuilder buffer, ref int bufferSize);
void get()
{
openFileDialog1.ShowDialog();
int bufferSize = 32;
StringBuilder buffer = new StringBuilder(bufferSize);
GetString(buffer, ref bufferSize);
string currentString = buffer.ToString();
MessageBox.Show(currentString);
}
以及以下 C++ 语言:
extern "C" __declspec(dllexport) void GetString(char* buffer, int* bufferSize){
MD5 md5;
char *returnChar = md5.digestFile(buffer);
cout << returnChar << endl;
strcpy(buffer, returnChar);
}
我想弄清楚为什么它不起作用。我尝试了很多很多东西,但似乎都不起作用。这可能是唯一不会直接让我的 C# 程序崩溃的东西,所以我只能使用它。我需要一个字符串,但我可以用 StringBuilder
来做也是。
是的,我的程序确实像 cout<<returnChar<<endl;
一样工作工作并显示我需要看到的内容。
是的,我尝试使用调用约定 stdcall
对其进行编码(marshal)处理和许多其他...传递和获取字符串的最简单方法是什么?
最佳答案
CharSet = CharSet.Auto
与 void GetString(char* buffer, int* bufferSize)
不兼容。使用 CharSet = CharSet.Ansi
使其工作。 CharSet.Auto
仅用于导入同时存在于 Ansi 和 Unicode 变体中的系统库函数,并让 .net 选择正确的函数进行调用。
关于c# - 传递 StringBuilder 并将结果从 c++ dll 返回到 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34331222/