通过C#结构在C++中设置变量

Setting variables in C++ through C# structure

我有一个包含 3 个项目的解决方案。一个 C# WinForms 项目,它依赖于第二个项目,它是一个 C++ DLL。 C++ DLL 依赖于第三个项目,它是一个静态库。静态库是带有 C++ 类 的 C 代码。 DLL 充当 C 代码和 C# 代码之间的互操作。

我需要通过C#结构设置静态库使用的变量

我没有 C++/CLI 的经验(我已经开始阅读了。网上找到的例子对我来说现在还没有意义)

到目前为止,我已经用 C# 创建了一个结构。我创建了一个初始化的非托管内存来保存这个结构:

IntPtr ptData = Marshal.AllocHGlobal(Marshal.SizeOf(objMyClass.data));//data is the structure I am initializing in the constructor of MyClass
Marshal.StructureToPtr(objPythonInterop.data, ptData, false);
objCPPClass.UpdateData(ptData);//objCPPClass is object to class in DLL. libClass is the object of class in static library

这是我在 C# 中的结构:

[StructLayout(LayoutKind.Sequential)]
public struct Data
{
    members here..
}

在 DLL 中,这是 UpdateData 函数:

Header:

void UpdateData(IntPtr ptrData);

来源:

void CPPClass::UpdateData(IntPtr ptrData)
{
    m_lib->UpdateDataInLib(ptrData);// m_lib is object to class in static library
}

UpdateDataInLib 是静态库中 Class 中的函数。如何在此函数中使用 ptrData 并更新变量?我在静态库中有一个类似于我的 C# 代码中定义的结构的结构。如何将 ptr 转换为该结构并访问成员?

我的 C++ 静态库中有一个结构,它包含 C# 中结构的等效成员:

extern "C"  __declspec(dllexport) typedef struct Data
{
    members here..
}Data, *pData;

我需要帮助。

有一种更简单的方法。如果您的 DLL 在调用后不再访问该结构,则您不需要动态内存分配。只需将结构放在堆栈上(尽管如此,您仍然需要 fixed):

var data = new objMyClass.data
{
    field1 = value1, // etc
};

unsafe
{
    fixed (objMyClass.data* ptr = &data)
    {
        objCPPClass.UpdateData(new IntPtr(ptr));
    }
}

如果结构是长期存在的,那么保持你的代码不变,但不要忘记释放分配的内存。

然后,在 C++ 端,您可以强制转换:

void CPPClass::UpdateData(IntPtr ptrData)
{
    m_lib->UpdateDataInLib(static_cast<pData>(ptrData.ToPointer()));
}

但是因为我不知道 UpdateDataInLib 的签名,所以我不确定这种方法。

此外,您可以去掉IntPtr中间步骤,只使用指针。