Я не могу понять, как исправить CA2123 для проекта C++/CLI. Вот пример проекта для демонстрации проблемы:
1) Создайте библиотеку классов С# (.NET 4)
ManagedClass.cs
пространство имен CSharpLibrary {
public interface IManagedClass
{
void WriteSomething();
}
public class ManagedClass : IManagedClass
{
public void WriteSomething()
{
}
}
}
2) Создайте консольное приложение C++/CLI (VS 2010):
AssemblyInfo.cpp
#include "stdafx.h"
using namespace System;
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
using namespace System::Runtime::InteropServices;
using namespace System::Security;
[assembly:AssemblyTitleAttribute("CPlusPlusCLIConsoleApp")];
[assembly:AssemblyDescriptionAttribute("")];
[assembly:AssemblyVersionAttribute("1.0.*")];
[assembly:ComVisible(false)];
[assembly:CLSCompliantAttribute(false)];
[assembly:SecurityCritical];
CPlusPlusCLIConsoleApp.h
#pragma once
using namespace CSharpLibrary;
using namespace System::Security;
typedef void* (__cdecl FACTORY_PROC)();
namespace CPlusPlusCLIConsoleApp
{
public ref class MainClass : public IManagedClass
{
public:
[SecurityCritical]
virtual void WriteSomething();
};
};
CPlusPlusCLIConsoleApp.cpp
#include "stdafx.h"
#include "CPlusPlusCLIConsoleApp.h"
using namespace System;
int main(){};
namespace CPlusPlusCLIConsoleApp
{
[SecurityCritical]
void MainClass::WriteSomething()
{
}
};
После включения всех правил безопасности Microsoft я получаю это предупреждение:
CA2123 Требования переопределения ссылки должны быть идентичны базовым
Добавьте следующий атрибут безопасности в «MainClass::WriteSomething(void)», чтобы соответствовать LinkDemand для базового метода «IManagedClass::WriteSomething(void)»: «SecurityCriticalAttribute».
CPlusPlusCLIConsoleApp cpluspluscliconsoleapp.cpp 13
Я попытался следовать тому, что предложил этот ответ StackOverflow, но это не устранило ошибку.
Я понимаю, что управляемая dll по умолчанию является SecurityCritical (я не хочу менять это в своем исходном проекте), поскольку я не указываю никакого атрибута SecurityAttribute. Почему dll C++ CLI не соответствует тому же значению по умолчанию?
Какие шаги я должен выполнить, чтобы исправить эту ошибку? (В основном, как я могу сделать метод WriteSomething SecurityCritical в C++ CLI)
EDIT 1: я задал тот же вопрос на MSDN .
РЕДАКТИРОВАТЬ 2: Связался с корпорацией Майкрософт, и это соответствует заданному поведению. У команды C++\CLI просто не было времени реализовать безопасность уровня 2 для C++\CLI. Следовательно, C++\CLI всегда застревает на уровне безопасности 1. Для этого можно безопасно подавить предупреждение анализа кода.