将字符串从C#传递到C++ DLL并返回 - 最小的例子

 StrAiGhT-OuT 发布于 2023-02-08 13:40

我试图制作绝对最简单的最小例子,说明如何在C#中向C++ DLL传递字符串.

我的C++看起来像这样:

using std::string;

extern "C" {
    string concat(string a, string b){
        return a + b;
    }
}

像标题一样

using std::string;

extern "C" {
    // Returns a + b
    __declspec(dllexport) string concat(string a, string b);
}

我的C#是

[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern string concat(string a, string b);
}

我用它来调用它:Console.WriteLine(concat("a","b"));

但是这会产生System.AccessViolationException.这似乎是处理最琐碎的事情,但我完全坚持下去.当我尝试使用"添加"功能进行类似的实验,这个功能需要两个双打并且返回一个双重而没有问题.

1 个回答
  • 您不能std::string跨互操作边界传递C++ .您无法在C#代码中创建其中一个.所以你的代码永远不会工作.

    您需要在互操作边界使用互操作友好类型.例如,以null结尾的字符数组.当您在同一模块中分配和释放内存时,这很有效.因此,将数据从C#传递到C++时很简单.

    C++

    void foo(const char *str)
    {
        // do something with str
    }
    

    C#

    [DllImport("...", CallingConvention = CallingConvention.Cdecl)
    static extern void foo(string str);
    
    ....
    
    foo("bar");
    

    在另一个方向,您通常希望调用者分配缓冲区,被调用者可以写入:

    C++

    void foo(char *str, int len)
    {
        // write no more than len characters into str
    }
    

    C#

    [DllImport("...", CallingConvention = CallingConvention.Cdecl)
    static extern void foo(StringBuilder str, int len);
    
    ....
    
    StringBuilder sb = new StringBuilder(10);
    foo(sb, sb.Capacity);
    

    2023-02-08 13:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有