C#和#x27;字符串';到C++';std::string';

C#和#x27;字符串';到C++';std::string';,c#,c++,marshalling,C#,C++,Marshalling,我有一个C#DLL,具有以下功能: [DllExport(ExportName = "getOutputString", CallingConvention = CallingConvention.StdCall)] public static String getOutputString() { String managedString = "123456789012345678901234567890"; return managedString; } 和C++应用程序使用

我有一个C#DLL,具有以下功能:

[DllExport(ExportName = "getOutputString", CallingConvention = CallingConvention.StdCall)]
public static String getOutputString()
{
    String managedString = "123456789012345678901234567890";
    return managedString;
}

和C++应用程序使用上述函数为:

HMODULE mod = LoadLibraryA("MyCustomDLL.dll");
using GetOutputString = std::string (__stdcall *) ();
GetOutputString getOutputString = reinterpret_cast<GetOutputString>(GetProcAddress(mod, "getOutputString"));

当我运行C++应用程序时,它崩溃了。 但是,当我只是在std::printf代码中使用函数时,它可以完美地工作:

std::printf("String from DLL: %s\n", getOutputString());

我的实际任务是从DLL得到一个字符串数组,但是如果您能帮助我从C++中得到一个简单的字符串到C++中的STD::string,那就太好了。

或仅给出一个提示,通过STD::PrtTf()在一个类型为STD::String,

< P> >,C级MARCHALS >代码> String 对象,简单地“指向ANSI字符的空终止数组指针”,或“C++中的代码> const char */COD> >

如果更改<代码> GETOutPoString 返回“<代码> const char */COD> >,一切都会起作用。

< P>,C++ MARSARS <代码> String < /Case>对象为简单的“指向ANSI字符的空终止数组的指针”,或“C++中的代码> const char */COD> >


如果将
GetOutputString的typedef更改为返回
const char*
,则一切都将正常工作。

C++与CLI一起使用System::String^(这是一个.Net字符串,即与C#相同)

那你就可以这么做了

std::string standardString = context.marshal_as<std::string>(managedString);
std::string standardString=context.marshal_作为(managedString);

(Credit[)

C++与CLI一起使用System::String^(这是一个.Net字符串,即与C#相同)

那你就可以这么做了

std::string standardString = context.marshal_as<std::string>(managedString);
std::string standardString=context.marshal_作为(managedString);

(信贷[)

很好,它成功了。我也尝试过不使用“const”only char*也能工作。非常感谢。我建议显式指定
UnmanagedType.LPUTF8Str
UnmanagedType.LPWStr
来支持Unicode,或
UnmanagedType.BStr
也能工作。我也尝试过不使用“const”only char*也能工作。非常感谢。我建议显式指定
UnmanagedType.LPUTF8Str
UnmanagedType.LPWStr
以支持Unicode,或
UnmanagedType.BStr
std::string standardString = context.marshal_as<std::string>(managedString);