传递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和许多其他约定来封送它。。。传递并取回字符串的最简单方法是什么?

传递StringBuilder并从c++dll向c#返回结果

CharSet = CharSet.Autovoid 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"))来称呼它?