объявление события и FieldOffsetAttribute с использованием - PullRequest
2 голосов
/ 28 июня 2011

У меня есть класс CLR, который использует атрибут Attribute StructLayout:

[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));
    }

1 Ответ

1 голос
/ 28 июня 2011

Применяется ли добавленный вами атрибут к событию ?или в поле ?Я не гуру 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.

, то есть точно , что я ожидаю увидеть при нацеливании на событие, а не на поле.

В качестве отступления - события на структурах - хитрые звери ...

...