CString到C#的C ++类

时间:2017-10-05 15:01:50

标签: c# c++ class pinvoke marshalling

如何将包含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#/.NETHow to Marshal a C++ Class

您的想法/解决方案/智慧之词非常受欢迎。 史蒂夫

0 个答案:

没有答案