传递StringBuilder并从c++dll向c#返回结果
本文关键字:返回 结果 c++dll StringBuilder 并从 传递 | 更新日期: 2023-09-27 18:27:05
我在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
和许多其他约定来封送它。。。传递并取回字符串的最简单方法是什么?
CharSet = CharSet.Auto
与void GetString(char* buffer, int* bufferSize)
不兼容。使用CharSet = CharSet.Ansi
使其工作。CharSet.Auto
仅用于导入同时存在于Ansi和Unicode变体中的系统库函数,并让.net选择合适的函数进行调用。
为什么不直接这么做呢?
public string CalculateMD5Hash(byte[] input)
{
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] hash = md5.ComputeHash(input);
// Convert to hex string
return string.Join("", hash.Select(h => h.ToString("X2")));
}
用var hash = CalculateMD5Hash(File.ReadAllBytes("path-goes-here"))
来称呼它?