我有一个CLR类,它使用Attribute StructLayout attribte:
[StructLayout(LayoutKind::Explicit)]
public ref class Matrix4 : System::ComponentModel::INotifyPropertyChanged
所有字段都使用FieldOffset属性。现在我需要添加一个事件,特别是我想要实现INotifyPropertyChanged接口,因此我需要
[FieldOffset(16*sizeof(Real))]
virtual event System::ComponentModel::PropertyChangedEventHandler^ PropertyChanged;
事件。编译器告诉我需要将FieldOffset属性分配给此事件,但在执行此操作后,编译器将抛出错误消息:
Error 34 error C1093: API call 'DefineCustomAttribute' failed '0x801311c0'
我不允许将StructLayout变为Sequential,所以我该如何解决这个问题呢?
任何帮助将不胜感激,
最好,apo。
通过分离解决:
protected:
[field:FieldOffset(16*sizeof(Real))]
System::ComponentModel::PropertyChangedEventHandler^ _pc;
public:
virtual event System::ComponentModel::PropertyChangedEventHandler^ PropertyChanged
{
void add(System::ComponentModel::PropertyChangedEventHandler^ p)
{
_pc += p;
}
void remove(System::ComponentModel::PropertyChangedEventHandler^ p)
{
_pc -= p;
}
void raise(Object ^sender, System::ComponentModel::PropertyChangedEventArgs ^ args)
{
_pc->Invoke(sender, args);
}
};
void OnPropertyChanged(String^ info)
{
PropertyChanged(this, gcnew System::ComponentModel::PropertyChangedEventArgs(info));
}
答案 0 :(得分:1)
您添加的属性是否适用于事件?或字段?我不是C ++专家,但看起来像就像“类似字段的事件”的C ++实现一样。 [FieldOffset]
属性仅适用于支持字段 - 而不是event
。在C#中,您将通过以下方式定位该字段:
[field:FieldOffset(yourOffset)]
public event PropertyChangedEventHandler PropertyChanged;
所以:确保你正在瞄准该领域。不过,我无法就C ++语法提出建议。也许没有一个,你需要使用一个显式的事件实现与你自己添加的字段(然后可以装饰)。
快速搜索支持此功能,该搜索显示错误编号链接到:
failed '0x801311c0'
Description: The custom attribute is not valid for the target object's type.
完全如果定位事件而不是字段,我希望看到的内容。
顺便说一下 - 结构上的事件是棘手的野兽......