с++ clr MSBUILD warning CA2240 - Добавьте реализацию GetObjectData

97
08 ноября 2019, 18:10

Собственно вопрос, реализация GetObjectData там есть, но выдает предупреждение. Полагаю что формат декларации GetObjectData не совпадает, но формат брал с MSDN.

Код класса:

[Serializable]
public ref struct EmuDevException
    : public Exception, ISerializable
{
private:
    int __line;
    String ^ __msg;
    GameData::EmuDevError __id;
    System::Exception ^ __ex;
protected:
    EmuDevException::EmuDevException(
        SerializationInfo ^info,
        StreamingContext ^context)
    {
        if (info == nullptr)
            return;
        this->Id = (GameData::EmuDevError)(info->GetByte(L"Id"));
        this->Line = info->GetInt32(L"Line");
        this->Msg = info->GetString(L"Msg");
    }
public:
    property String ^ Msg
    {
        String ^ get() { return __msg; }
        void set(String ^v) { __msg = v; }
    };
    property GameData::EmuDevError Id
    {
        GameData::EmuDevError get() { return __id; }
        void set(GameData::EmuDevError v) { __id = v; }
    };
    property int Line
    {
        int get() { return __line; }
        void set(int v) { __line = v; }
    };
    property System::Exception ^ InnerExcept
    {
        System::Exception ^ get() { return __ex; }
    };
    [System::Security::Permissions::SecurityPermission(
        System::Security::Permissions::SecurityAction::LinkDemand,
        Flags = System::Security::Permissions::SecurityPermissionFlag::SerializationFormatter,
        Unrestricted = false
    )]
    void GetObjectData(
        SerializationInfo ^info,
        StreamingContext ^context)
    {
        if (info == nullptr)
            return;
        info->AddValue(L"Id", __id);
        info->AddValue(L"Line", __line);
        info->AddValue(L"Msg", __msg);
    }
    EmuDevException::EmuDevException(GameData::EmuDevError _id) : __id(_id), __line(-1), __msg(String::Empty), __ex(nullptr) {}
    EmuDevException::EmuDevException(GameData::EmuDevError _id, int _line) : __id(_id), __line(_line), __msg(String::Empty), __ex(nullptr) {}
    EmuDevException::EmuDevException(GameData::EmuDevError _id, int _line, String ^_msg) : __id(_id), __line(_line), __msg(_msg), __ex(nullptr) {}
    EmuDevException::EmuDevException(GameData::EmuDevError _id, int _line, System::Exception ^_ex) : __id(_id), __line(_line), __msg(String::Empty), __ex(_ex) {}
};

Полный вывод ошибки:

MSBUILD : warning CA2240: Microsoft.Usage : Добавьте реализацию GetObjectData к типу 'EmuDevException'.

Answer 1

Сообщение анализатора кода CA2240 в данном случае выводится из-за того, что метод GetObjectData не помечен как переопределяемый (виртуальный). Так как базовый класс Exception содержит свою реализацию GetObjectData, необходимо также добавить override. Правильное объявление:

void virtual GetObjectData(SerializationInfo^ info, StreamingContext^ context) override
READ ALSO
WPF обработка аргументов event'а во View

WPF обработка аргументов event'а во View

Пусть у меня во ViewModel имеется событие с аргументом:

100
Изменение значения из задержкой

Изменение значения из задержкой

Использую данную функцию для того чтобы поменять значение флагаТо есть имею переменную которая принимает true or false

99
C# в PowerPoint

C# в PowerPoint

У меня есть презентацияВ неё с помощью c# хочу сделать например перетаскивание объектов или что то другое

89