You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决C++ DLL向C#应用返回字符串时运行无输出问题

问题根源

你当前的写法存在本质错误:std::string 是C++标准库专属类型,C#互操作层无法识别其内存布局,也无法正确处理对应的内存管理逻辑,因此无法正常拿到返回的字符串,大概率还存在隐藏的内存崩溃风险。

修复方案

这里提供两种经过验证的可行方案,选择任意一种即可:

方案1:使用COM标准BSTR类型传递字符串(推荐)

BSTR是跨语言互操作的标准字符串类型,C#可以自动识别并完成内存释放,不需要额外处理。

修改后的C++ DLL代码:

#include <iostream>
#include <comdef.h>
#include <iomanip>
#include <comutil.h>
#include <string>

extern "C" __declspec(dllexport) BSTR getName();

BSTR getName() {
    std::string _name = "XYZ";
    // 将std::string转为BSTR,Detach将内存所有权交给调用方
    return _bstr_t(_name.c_str()).Detach();
}

修改后的C#代码:

只需要给返回值增加封送标记即可:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    [DllImport("NativeLibrary.dll")]
    [return: MarshalAs(UnmanagedType.BStr)]
    public static extern string getName();
    private void btnAdd_Click(object sender, EventArgs e)
    {
        string res = getName();
        Console.WriteLine(res);
    }
}

方案2:使用C风格char*传递字符串

如果不想依赖COM组件,可以选择返回用CoTaskMemAlloc分配的C风格字符串,C#会自动调用CoTaskMemFree释放对应内存。

修改后的C++ DLL代码:

#include <iostream>
#include <string>
#include <Objbase.h> // 引入CoTaskMemAlloc相关头文件

extern "C" __declspec(dllexport) char* getName();

char* getName() {
    std::string _name = "XYZ";
    size_t bufSize = _name.size() + 1;
    // 必须用CoTaskMemAlloc分配内存,不能用malloc/new
    char* res = (char*)CoTaskMemAlloc(bufSize);
    strcpy_s(res, bufSize, _name.c_str());
    return res;
}

修改后的C#代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    [DllImport("NativeLibrary.dll")]
    [return: MarshalAs(UnmanagedType.LPStr)]
    public static extern string getName();
    private void btnAdd_Click(object sender, EventArgs e)
    {
        string res = getName();
        Console.WriteLine(res);
    }
}

额外注意事项

  • 禁止直接返回栈上分配的字符串(比如直接返回"XYZ"或者栈上char数组的指针),函数退出后栈内存会被回收,会拿到野指针导致乱码或崩溃。
  • 如果用malloc/new分配char*返回,必须额外在C++ DLL中导出对应的释放函数,C#拿到字符串后手动调用释放,否则会出现内存泄漏。

内容的提问来源于stack exchange,提问作者Praveer Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 10:36:04