我无法理解如何为 C++/CLI 项目修复 CA2123。这是一个演示该问题的示例项目:
1) 创建一个 C# (.NET 4) 类库
托管类.cs
命名空间 CSharpLibrary {
public interface IManagedClass
{
void WriteSomething();
}
public class ManagedClass : IManagedClass
{
public void WriteSomething()
{
}
}
}
2)创建一个 C++/CLI 控制台应用程序(VS 2010):
装配信息.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)”以匹配基础方法“IManagedClass::WriteSomething(void)”上的 LinkDemand:“SecurityCriticalAttribute”。
CPlusPlusCLIConsoleApp cpluspluscliconsoleapp.cpp 13
我试图遵循这个StackOverflow 答案的建议,但它没有修复错误。
我知道托管 dll 默认为 SecurityCritical(我不想在我的原始项目中更改它),因为我没有指定任何 SecurityAttribute。为什么 C++ CLI dll 不遵循相同的默认值?
我应该遵循哪些步骤来修复此错误?(基本上我怎样才能在 C++ CLI 中创建 WriteSomething 方法 SecurityCritical)
编辑 1:我在MSDN上问过同样的问题。
编辑 2:联系了微软,这是一种设计行为。C++\CLI 团队只是没有时间为 C++\CLI 实施 Level2 Security。因此 C++\CLI 总是停留在 Level1 Security。可以安全地抑制相同的代码分析警告。