c# - 传递 StringBuilder 并将结果从 c++ dll 返回到 c#

标签 c# c++ character-encoding calling-convention

我在 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.Autovoid 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/

相关文章:

c# 如何获取资源文件夹中所有项目的文件路径

c++ - 为了让 QtSql 正常运行,我需要哪些 .dll 文件?

c++ - NtOpenKey 失败并显示 0xC0000034 - 如何解决这个问题?

php - 为什么在将 MS SQL 数据转换为 MYSQL 时会出现无效字符?

python - 为什么这个土耳其字符在我小写时会被损坏?

php - 在 PHP 中用 "equivalent"ASCII 替换变音符号?

c# - 如何复制具有取消复制功能的文件?

c# - 我如何使用 XmlDocument.Save() 将 ="us-ascii"编码为数字字符实体而不是问号?

c# - 从另一个 AppDomain 编码程序集