如何在COM DLL接口中暴露C#的DayOfWeek枚举?
解决COM DLL中使用C#自带DayOfWeek枚举的问题
问题原因
C#自带的System.DayOfWeek枚举虽然本身标记了[ComVisible(true)],但它属于.NET Framework的核心类型库(mscorlib.tlb),而非你的自定义COM库。生成C++包装器时,你的库的类型库仅引用该系统枚举,不会将其定义复制到自身命名空间下,导致你尝试通过MSAToolsLibrary::DayOfWeek访问时出现未定义错误。
解决方案
有两种可行方案,推荐使用自定义封装枚举的方式,确保COM组件的封装性和调用方的易用性:
方案1:封装自定义枚举(推荐)
在你的C# COM项目中定义一个与DayOfWeek一一对应的自定义枚举,标记为COM可见,将其作为对外暴露的类型,内部再转换为System.DayOfWeek使用:
// 生成唯一GUID替换此处的示例值 [ComVisible(true)] [Guid("12345678-ABCD-EFGH-IJKL-1234567890AB")] public enum MeetingDay { Sunday = DayOfWeek.Sunday, Monday = DayOfWeek.Monday, Tuesday = DayOfWeek.Tuesday, Wednesday = DayOfWeek.Wednesday, Thursday = DayOfWeek.Thursday, Friday = DayOfWeek.Friday, Saturday = DayOfWeek.Saturday }
修改你的属性定义,使用自定义枚举对外暴露:
private DayOfWeek _MeetingDay; public MeetingDay MeetingDay { get => (MeetingDay)_MeetingDay; set => _MeetingDay = (DayOfWeek)value; }
重新生成COM DLL和C包装器后,即可在C中正常使用:
MSAToolsLibrary::MeetingDay eMeetingDay = MSAToolsLibrary::MeetingDay_Sunday;
方案2:在C++中显式导入系统类型库
若不想修改C#代码,可在C++项目中显式导入mscorlib.tlb,直接使用系统命名空间下的DayOfWeek:
// 在C++文件头部添加导入指令 #import <mscorlib.tlb> raw_interfaces_only, named_guids, auto_search using namespace System; // 使用时直接引用System命名空间下的枚举 DayOfWeek eMeetingDay = DayOfWeek::Sunday;
这种方式需要调用方处理系统类型库的依赖,可能存在命名冲突风险,不如方案1封装性好。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

