我正在尝试使用P / Invoke从C#调用非托管C ++ DLL中的函数。 C ++ DLL使用CString
作为函数参数并返回,例如
CString AFX_EXT_API GetUserName(CString& userID)
不幸的是,C ++是遗留代码,我无法更改以使用更通用的LPSTR
(甚至char *
)。
有没有办法将CString编组成.NET兼容对象?或者以某种方式装饰.NET char[]
以封送到CString?
答案 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。