我一直在开发一个原型代码应用程序,该应用程序在 C# 中运行并使用旧 C++ 代码中的类和函数(以导入的 DLL 的形式)。代码要求是将类对象传递给非托管 C++ DLL(来自 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);
}
对 DLL 的 C# 函数调用:
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# 对象)。我相信我在类编组或内存/指针问题上遗漏了一些东西。我错过了什么?
编辑:我更改了上面的代码以反映 Bond 建议的 C#/C++ 中方法/函数定义的更改。现在,C# 代码可以正确检索传入的值 (1234)。这暴露了 C++ DLL 中的另一个问题。1234 值不可用于 C++ 代码。相反,该对象在 DLL 中的值为 0。我想使用预定义的 C++ 函数从 DLL 中编辑对象。任何更多的帮助将不胜感激。谢谢!