带有CString的PInvoke

时间:2011-10-01 04:22:55

标签: visual-c++ pinvoke cstring

我正在尝试使用P / Invoke从C#调用非托管C ++ DLL中的函数。 C ++ DLL使用CString作为函数参数并返回,例如

CString AFX_EXT_API GetUserName(CString& userID)

不幸的是,C ++是遗留代码,我无法更改以使用更通用的LPSTR(甚至char *)。

有没有办法将CString编组成.NET兼容对象?或者以某种方式装饰.NET char[]以封送到CString?

2 个答案:

答案 0 :(得分:3)

您无法在托管代码中创建CString。很明显,您需要在托管代码和本机代码之间添加一个额外的层。

这使您有机会制作介于其间的C ++ / CLI DLL。您可以从托管程序集调用此代码,而无需P / invoke。从C ++ / CLI中间层,您可以创建CString

然而,有一点需要注意。您必须使用与本机DLL相同的C ++运行时。这可能是可能的,但它很可能是一个绊脚石。例如,如果DLL是用MSVC6编写的,那么您还需要使用MSVC6构建中间层,并排除C ++ / CLI。在这种情况下,回到P / invoke和char*

我要强调的是,基于CString导出DLL接口是一种可怕的做法,我正在寻找DLL的替代方案。

答案 1 :(得分:1)

如果你不能改变DLL本身,显然的选择是编写一个代理DLL,它接受char [],分配一个CString,然后调用DLL。