如何使用CString参考调用非托管C ++ DLL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用CString参考调用非托管C ++ DLL相关的知识,希望对你有一定的参考价值。

使用VS2010我正在围绕一个在其公共接口中使用MFC CStrings的非托管C ++ DLL构建一个C ++ / CLI包装器DLL。非托管C ++ DLL包含一个我需要访问的类。我的问题是这个类包含使用CString引用的方法,例如:

BOOL GetUnits(eSysOfUnits sysUnit, CString &Unit, Cstring &Format);

在我的C ++ / CLI包装器中,我试图像这样访问它

BOOL GetUmUnits(eSysU sysunit, String^ %cunit, String^ %format)
{
   GetUnits(sysunit, marshal_as<CString>(cunit), marshal_as<CString>(format));
}

这给我一个编译错误说明

C2665:msclr :: interop :: marshal_as:3重载都不能转换所有参数类型

GetUmUnits将通过C#表单访问。 cunit和格式需要由非管理代码更新。

我做错了什么是不可能的?

答案

你的包装器必须将托管的String^转换为实际的CString对象并直接传递它。编组人员不知道如何创建CString对象。

在不同版本的MFC中有不同版本的CString,因此您必须链接到非托管DLL构建一个版本的MFC版本。

以上是关于如何使用CString参考调用非托管C ++ DLL的主要内容,如果未能解决你的问题,请参考以下文章

.Net调用非托管代码(P/Invoke与C++InterOP)

如何在非托管 c++ dll 中查找调用方程序集名称

使用指针调用非托管代码

dllimport如何在非托管dll中获取哪个应用程序调用了函数

C# 调用非托管 C++ 返回平方符号字符串

从非托管 c++ 调用托管 c# 函数