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++ dll 的 char 指针数组传递给 c# 字符串