如何将包含CString的C ++类中保存的数据返回给C#?
我的C ++课程:
class Item
{
public:
AFX_EXT_CLASS Item();
AFX_EXT_CLASS ~Item();
int m_nType;
int m_nField;
double m_dVal;
int m_nVal;
CString m_sVal;
};
在C ++中使用Item类:
Item MyObject::GetVal(int nField)
{
Item Val;
...
return Val;
}
...
Item Val = GetVal(i);
理想情况下,这个Item对象可以在C#中用作带有int,double和string成员的类或结构。
我已经设法检索包含int和char *的C ++结构,但我不确定如何为CString和类编写解决方案。 我无法更改Item类。
我对结构的解决方案是:
extern "C" __declspec(dllexport) WINUSERUI* jCallValidateUser(LPTSTR sUser, LPTSTR sEditPass)
{
winLogin->ValidateUser(sUser, sEditPass);
return &winLogin->twu; // where WINUSERUI twu
}
typedef struct WINUSERUI
{
int m_nUser;
char *m_sUser;
char *m_sUserStatus;
char *m_sDomain;
int m_nLevel;
int m_nTimeout;
int bLogonOK;
char *m_sPassword;
} WinUserUI;
然后在C#中:
[StructLayout(LayoutKind.Sequential, Pack = 0, CharSet = CharSet.Ansi)]
public struct WinUserUI
{
public int m_nUser;
public string m_sUser;
public string m_sUserStatus;
public string m_sDomain;
public int m_nLevel;
public int m_nTimeout;
public int bLogonOK;
public string m_sPassword;
}
[DllImportAttribute("MyDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "jCallValidateUser")]
static private extern IntPtr jCallValidateUser(string username, string password);
public static WinUserUI ValidateUser(string username, string password)
{
var ptr = jCallValidateUser(username, password);
return (WinUserUI)Marshal.PtrToStructure(ptr, typeof(WinUserUI));
}
像这样使用:
WinUserUI twu = ValidateUser(username, password);
我已经阅读了有关PInvoke的信息,但解决方案对我的需求似乎过于复杂......或者我确实需要一个比我期望的更复杂的解决方案。这是我的观点。
许多文章都是: Call C++ functions from C#/.NET和 How to Marshal a C++ Class
您的想法/解决方案/智慧之词非常受欢迎。 史蒂夫