.net 使用事件声明和FieldOffsetAttribute
我有一个使用StructLayout属性的CLR类:.net 使用事件声明和FieldOffsetAttribute,.net,c++-cli,clr,.net,C++ Cli,Clr,我有一个使用StructLayout属性的CLR类: [StructLayout(LayoutKind::Explicit)] public ref class Matrix4 : System::ComponentModel::INotifyPropertyChanged 所有字段都使用FieldOffset属性。现在我需要添加一个事件,特别是我想要实现INotifyPropertyChanged接口,因此我需要 [FieldOffset(16*sizeof(Real))] virtual
[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,那么如何解决此问题
任何帮助都将不胜感激
最好的,阿波
通过分离解决:
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));
}
您添加的属性是否应用于事件?还是去球场?我不是C++大师,但它看起来像是一个C++实现的“类事件”。
[FieldOffset]
属性仅适用于支持字段,而不适用于事件。在C#中,您可以通过以下方式瞄准字段:
[field:FieldOffset(yourOffset)]
public event PropertyChangedEventHandler PropertyChanged;
所以:确保你的目标是场地。不过,我不能对C++语法提出建议。可能没有,您需要使用显式事件实现和您自己添加的字段(然后可以装饰)
快速搜索支持这一点,该搜索显示错误号链接到:
failed '0x801311c0'
Description: The custom attribute is not valid for the target object's type.
这正是我希望看到的,如果目标是活动而不是场地
作为旁白-结构上的事件是棘手的野兽