Я работал над прототипом приложения, которое работает на 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. Любая дополнительная помощь приветствуется. Спасибо!