[英]Passing String from C# to native C++ Library in 1256 Encoding via CLI
[英]passing string from C++/CLI class library to C#
我在VS 2010 C ++ / CLI中编写了一个类库,并创建了一个dll。
// testclass.h
#pragma once
#include <string>
namespace test
{
public ref class testclass
{
public:
std::string getstringfromcpp()
{
return "Hello World";
}
};
}
我想在C#程序中使用它,然后添加此dll进行引用:
using test;
...
testclass obj = new testclass();
textbox1.text = obj.getstringfromcpp();
...
我该怎么办?
对于互操作方案,您需要返回一个字符串对象,您可以从.NET代码中读取该对象。
不要返回std::string
(在C#中没有这样的东西)或const char *
(可从C#读取,但您必须管理内存释放)或类似的事情。 而是返回System::String^
。 这是.NET代码中的标准字符串类型。
这将起作用:
public: System::String^ getStringFromCpp()
{
return "Hello World";
}
但是,如果实际上有const char *
或std::string
对象,则必须使用marshal_as
模板:
#include <msclr/marshal.h>
public: System::String^ getStringFromCpp()
{
const char *str = "Hello World";
return msclr::interop::marshal_as<System::String^>(str);
}
有关更多详细信息,请阅读C ++中的封送处理概述 。
要将System::String^
转换为std::string
还可以使用marshal_as
模板,如上面的链接所述。 您只需要包含其他标题:
#include <msclr/marshal_cppstd.h>
System::String^ cliStr = "Hello, World!";
std::string stdStr = msclr::interop::marshal_as<std::string>(cliStr);
在我的程序中,它以某种方式拒绝将std :: string直接转换为System :: String ^,但是使用char *强制转换==> std :: string.c_str()
public: System::String^ getStringFromCpp()
{
std::string str = "Hello World";
return msclr::interop::marshal_as<System::String^>(str.c_str());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.