C# 如何调用非托管C++;带有CString引用的DLL 我使用VS2010在非托管C++ DLL中构建一个C++/CLI包装器DLL,它在其公共接口中使用MFC cSnc++。非托管C++ DLL包含一个我需要访问的类。我的问题是该类包含使用CString引用的方法,例如: BOOL GetUnits(eSysOfUnits sysUnit, CString &Unit, Cstring &Format);
在我的C++/CLI包装中,我尝试这样访问它C# 如何调用非托管C++;带有CString引用的DLL 我使用VS2010在非托管C++ DLL中构建一个C++/CLI包装器DLL,它在其公共接口中使用MFC cSnc++。非托管C++ DLL包含一个我需要访问的类。我的问题是该类包含使用CString引用的方法,例如: BOOL GetUnits(eSysOfUnits sysUnit, CString &Unit, Cstring &Format);,c#,c++,mfc,command-line-interface,C#,C++,Mfc,Command Line Interface,在我的C++/CLI包装中,我尝试这样访问它 BOOL GetUmUnits(eSysU sysunit, String^ %cunit, String^ %format) { GetUnits(sysunit, marshal_as<CString>(cunit), marshal_as<CString>(format)); } BOOL GetUmUnits(eSysU系统单元,字符串^%cunit,字符串^%格式) { GetUnits(sysunit、ma
BOOL GetUmUnits(eSysU sysunit, String^ %cunit, String^ %format)
{
GetUnits(sysunit, marshal_as<CString>(cunit), marshal_as<CString>(format));
}
BOOL GetUmUnits(eSysU系统单元,字符串^%cunit,字符串^%格式)
{
GetUnits(sysunit、marshal_as(cunit)、marshal_as(format));
}
这给了我一个编译器错误
C2665:msclr::interop::marshal_as:3个重载都无法转换所有参数类型
GetUmUnits将通过C#表单访问。cunit和格式需要由未管理的代码更新
我做错了什么?不可能吗?您的包装器必须将托管的
字符串^
转换为实际的CString
对象并直接传递它。封送员不知道如何创建CString
对象
在不同版本的MFC中有不同版本的
CString
,因此您必须链接到非托管DLL构建的相同MFC版本。您的包装器必须将托管字符串^
转换为实际的CString
对象并直接传递它。封送员不知道如何创建CString
对象
在不同版本的MFC中有不同版本的
CString
,因此您必须链接到非托管DLL生成的同一个MFC版本。我实际上做了一个转换,所以CString cs(cuint)和safe for format,然后调用GetUnits(sysunit,cs,cs2),使用封送作为将其转换回字符串^。它起作用了。所以我想我回答了我自己的问题。但是我想知道它是否安全?我实际上做了一个转换,所以CString cs(cuint)和safe for format,然后调用GetUnits(sysunit,cs,cs2)将它转换回字符串^。它起作用了。所以我想我回答了我自己的问题。但是我想知道它是否安全?