Visual c++ 有一个指环的平沃克

Visual c++ 有一个指环的平沃克,visual-c++,pinvoke,cstring,Visual C++,Pinvoke,Cstring,我试图用p/Unjk调用C++中的非托管C++ DLL中的函数。C++ DLL使用cStult/Cuth>作为函数参数,返回,如 CString AFX_EXT_API GetUserName(CString& userID) 遗憾的是,C++是我不能更改的,使用更通用的 LPSRt< /COD>(或者甚至 char * >。 有没有办法将CString封送到与.NET兼容的对象中?或者以某种方式修饰.NETchar[]以封送到CString?如果无法更改DLL本身,那么明显的选择是编

我试图用p/Unjk调用C++中的非托管C++ DLL中的函数。C++ DLL使用cStult/Cuth>作为函数参数,返回,如

CString AFX_EXT_API GetUserName(CString& userID)
<>遗憾的是,C++是我不能更改的,使用更通用的<代码> LPSRt< /COD>(或者甚至<代码> char *<代码> >。
有没有办法将CString封送到与.NET兼容的对象中?或者以某种方式修饰.NET
char[]
以封送到CString?

如果无法更改DLL本身,那么明显的选择是编写一个代理DLL,该DLL将接受char[],分配一个CString,然后调用DLL

如果您不能更改DLL本身,那么显而易见的选择是编写一个代理DLL,它将接受char[],分配一个CString,然后调用DLL

您不能在托管代码中创建
CString
。因此,很明显,您需要在托管代码和本机代码之间增加一层

这使您有机会创建一个C++/CLI DLL,它位于两者之间。您可以从托管程序集调用此代码,而无需P/invoke。从C++/CLI中间层可以创建
CString

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


我要强调的是,基于
CString
导出DLL接口是一种糟糕的做法,我会寻找DLL的替代品。

您不能在托管代码中创建
CString
。因此,很明显,您需要在托管代码和本机代码之间增加一层

这使您有机会创建一个C++/CLI DLL,它位于两者之间。您可以从托管程序集调用此代码,而无需P/invoke。从C++/CLI中间层可以创建
CString

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


我要强调的是,基于
CString
导出DLL接口是一种糟糕的做法,我将寻找DLL的替代品。

DLL包含关键业务逻辑,转换为.NET需要更长的时间。我同意首先用CString导出DLL函数是个坏主意,但遗留代码是15年前编写的。DLL包含关键的业务逻辑,转换为.NET需要更长的时间。我同意首先用CString导出DLL函数是个坏主意,但遗留代码是15年前编写的。这无疑是对未来的证明。