使用并集从C#调用C++DLL
Calling a C++ DLL from C# with unions
我正在接收来自C++DLL的回调,需要接受如下结构:
typedef struct {
union {
SXAnyDevice any_device;
SXInternalDevice internal;
SXExternalDevice external;
}
int device_type;
} SXDevice;
我已经创建了C#中引用的结构,并设置了显式布局,但我在设置device_type字段的FieldOffset时遇到了问题,因为并集中引用的结构化并不都是相同的大小。
[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
public struct SXDevice {
[FieldOffset(0)]
public SXAnyDevice any_device;
[FieldOffset(0)]
public SXInternalDevice internal_device;
[FieldOffset(0)]
public SXExternalDevice external_device;
[FieldOffset(**Not sure how to handle this**)]
public int device_type;
}
有什么最好的方法吗?
如何快速获取偏移量:使用C++中offsetof(SXDevice, device_type)
返回的值。
偏移说明:
一个并集占用的空间与其最大的组成部分一样多。
设maxSize
=max(sizeof(SXAnyDevice), sizeof(SXInternalDevice), sizeof(SXExternalDevice))
现在一切都取决于它在C++端的配置方式:
- 如果没有填充(
#pragma pack(1)
),则device_type
的偏移量将简单地等于maxSize
- 如果有填充,请将
maxSize
与下一个包边界对齐
来自#pragma pack
文档:
指定要用于打包的值(以字节为单位)。如果没有为模块设置编译器选项/Zp,则n的默认值为8。有效值为1、2、4、8和16。构件的对齐将位于n的倍数或构件大小的倍数(以较小者为准)的边界上。
相关文章:
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 在 NodeJS 异步调用C++ DLL
- 从C#调用C++dll引发SEHException
- 为什么在调用C#DLL时不需要提供字符串缓冲区
- 从Delphi调用C++DLL时发生访问冲突
- 从 Python 调用 Windows DLL 函数时出错
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 从Excel VBA调用C++DLL只能从Visual Studio中的调试实例工作
- 从 JNI 调用的 DLL 从哪里获取其内存以进行分配,例如 Malloc
- 使用指针调用C++ DLL 函数
- 如何从 UWP 应用调用"libheif.dll"函数
- 从C++调用 Delphi DLL 函数
- 在C#代码中调用C DLL
- 从C#调用C DLL方法
- 是否可以使用 Excel::_Application::Run 调用 C# dll 方法
- 从C++调用 Delphi DLL IStream 参数的问题
- 在 C# 中调用C++ DLL 库中导出的函数
- 内存损坏从vb.net调用c dll
- 当参数之一是指针数组时,如何从C#调用C DLL
- 调用C++dll的C#dll在windows 10上找不到该dll