.net 使用事件声明和FieldOffsetAttribute

.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属性的CLR类:

[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.
这正是我希望看到的,如果目标是活动而不是场地

作为旁白-结构上的事件是棘手的野兽