C++ 将字符串传递到 C# dll

Posted

技术标签:

【中文标题】C++ 将字符串传递到 C# dll【英文标题】:C++ passing string into C# dll 【发布时间】:2013-08-27 03:21:55 【问题描述】:

我有一个 C++ 应用程序通过 wrapper.cpp 在 C# dll 中调用 WORD(name,cpu) 函数,它包含一个错误。谁能帮我?提前致谢。

错误 C2664:“CsharpDLL::WORD”:无法将参数 1 从“std::string”转换为“System::String ^”

C++ 应用程序

extern "C" _declspec(dllimport) void _stdcall WORD(string name, string cpu);

int main()

    string name="f";
    string cpu="F";

    WORD(name,cpu);

包装器.cpp

extern "C" _declspec(dllexport) void _stdcall WORD(string name ,string cpu)

    return CsharpDLL::WORD(name,cpu);  // <-- Error here

C# dll

public class CsharpDLL

    public static void WORD(string name, string cpu)
    
    if(cpu=="add")
    
        Console.WriteLine("aa");
    

【问题讨论】:

您确定 C++ 应用程序是纯 C++ 应用程序,还是托管 C++(例如 C++/CLI 或 C++/CX)? C++ 应用程序是“无公共语言运行时支持”,但 wrapper.ccp 是“公共语言运行时支持 (/clr)” 您是否尝试过像这样创建字符串:return CsharpDLL::WORD(gcnew String(name), gcnew String(cpu)); 你可能应该使用“const char *”而不是“std::string”。 相当肯定const char* 不会比std::string 更隐式地转换为System::String^ 【参考方案1】:

您需要从传入包装函数的每个std::string 的字符数组构造一个System::String

extern "C" _declspec(dllexport) void _stdcall WORD(string name ,string cpu)

    System::String ^managedName = gcnew System::String(name.c_str());
    System::String ^managedCpu = gcnew System::String(cpu.c_str());

    return CsharpDLL::WORD(managedName, managedCpu);

【讨论】:

以上是关于C++ 将字符串传递到 C# dll的主要内容,如果未能解决你的问题,请参考以下文章

在不同的返回类型上将字符串从 C# 传递到 C++ DLL 不同的文本编码

将 C# 字符串传递给 C++ dll 在发布版本中失败

将 c++ dll 的 char 指针数组传递给 c# 字符串

如何将 COM 对象的 C# 引用传递给 C++ DLL

使用 DLL 将 C# StringBuilder / 字符串传递给 C++ char*

使用 void 指针将字符串从 C++ 传递到 C#