Передача объекта класса C# в класс DLL C++ и из него

Я работал над прототипом приложения, которое работает на C# и использует классы и функции из старого кода C++ (в виде импортированной DLL). Требование кода состоит в том, чтобы передать объект класса в неуправляемую DLL C++ (из C#) и сохранить/изменить его для последующего извлечения приложением C#. Вот код, который у меня есть до сих пор...

Простой класс C++ DLL:

class CClass : public CObject
{
public:
    int intTest1
};

Функции C++ DLL:

CClass *Holder = new CClass;

extern "C"
{
    // obj always comes in with a 0 value.
    __declspec(dllexport) void SetDLLObj(CClass* obj)
    {
        Holder = obj;
    }

    // obj should leave with value of Holder (from SetDLLObj).
    __declspec(dllexport) void GetDLLObj(__out CClass* &obj)
    {
        obj = Holder;
    }
}

Класс C# и оболочка:

[StructureLayout(LayoutKind.Sequential)]
public class CSObject
{
    public int intTest2;
}

class LibWrapper
{
    [DLLImport("CPPDLL.dll")]
    public static extern void SetDLLObj([MarshalAs(UnmanagedType.LPStruct)] 
      CSObject csObj);
    public static extern void GetDLLObj([MarshalAs(UnmanagedType.LPStruct)] 
      ref CSObject csObj);
}

Вызов функции C# для DLL:

class TestCall
{
    public static void CallDLL()
    {
        ...
        CSObject objIn = new CSObject();
        objIn.intTest2 = 1234; // Just so it contains something.
        LibWrapper.SetDLLObj(objIn);
        CSObject objOut = new CSObject();
        LibWrapper.GetDLLObj(ref objOut);
        MessageBox.Show(objOut.intTest2.ToString()); // This only outputs "0".
        ...
    }
}

Ничего, кроме ненужных значений быть доступным в DLL (исходя из переданного объекта C#). Я считаю, что что-то упускаю из-за сортировки классов или проблемы с памятью/указателем. Что мне не хватает?

Редактировать: Я изменил приведенный выше код, чтобы отразить изменения в определениях методов/функций в C#/C++, предложенные Бондом. Передаваемое значение (1234) теперь корректно извлекается кодом C#. Это выявило еще одну проблему в C++ DLL. Значение 1234 недоступно для кода C++. Вместо этого объект имеет значение 0 внутри DLL. Я хотел бы использовать предопределенные функции C++ для редактирования объекта из DLL. Любая дополнительная помощь приветствуется. Спасибо!

10
задан notsodev 21 June 2012 в 13:33
поделиться