通过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
中间步骤,只使用指针。
我有一个包含 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
中间步骤,只使用指针。