事件声明和FieldOffsetAttribute使用

时间:2011-06-28 11:47:49

标签: .net c++-cli clr

我有一个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));
    }

1 个答案:

答案 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.

完全如果定位事件而不是字段,我希望看到的内容。

顺便说一下 - 结构上的事件是棘手的野兽......