Ich kann nicht verstehen, wie CA2123 für ein C++/CLI-Projekt zu beheben. Hier ist ein Beispielprojekt, das Problem zu demonstrieren:Wie behebt man CA2123 (Override Link Anforderungen sollte identisch mit Base) in einem verwalteten C++/CLI Projekt
1) Erstellen Sie eine C# (.NET 4) Klassenbibliothek
ManagedClass.cs
Namespace CSharpLibrary {
public interface IManagedClass
{
void WriteSomething();
}
public class ManagedClass : IManagedClass
{
public void WriteSomething()
{
}
}
}
2) Erstellen Sie eine C++/CLI-Konsolenanwendung (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()
{
}
};
Nach ENAB ling alle Microsoft Security Rules, erhalte ich diese Warnung:
CA2123 Anforderungen außer Kraft setzen Link sollte
Fügen Sie die folgende Sicherheitsattribut zu 'Mainclass :: WriteSomething (void)', um zu stützen identisch sein zu entsprechen a LinkDemand on Basismethode 'IManagedClass :: WriteSomething (void)': 'SecurityCriticalAttribute'.
CPlusPlusCLIConsoleApp cpluspluscliconsoleapp.cpp 13
Ich versuchte zu folgen, was diese StackOverflow answer vorgeschlagen, aber es hat nicht den Fehler zu beheben.
Ich verstehe, dass die verwaltete DLL standardmäßig SecurityCritical ist (ich möchte dies nicht in meinem ursprünglichen Projekt ändern), da ich keine SecurityAttribute angeben. Warum folgt die C++ CLI-DLL nicht demselben Standard?
Welche Schritte sollte ich befolgen, um diesen Fehler zu beheben?
EDIT 1 (Im Grunde genommen wie kann ich WriteSomething Methode sicherheitskritischen in C++ CLI machen): Ich habe die gleiche Frage gestellt auf MSDN.
EDIT 2: kontaktiert Microsoft und es ist ein wie entworfenes Verhalten. Das C++ \ CLI-Team hatte gerade keine Zeit, Level2 Security für C++ \ CLI zu implementieren. Daher bleibt C++ \ CLI immer bei Level1 Security hängen. Man kann die Codeanalysewarnung für dasselbe sicher unterdrücken.
"Ich habe versucht zu folgen, was diese StackOverflow Antwort vorgeschlagen, aber es hat den Fehler nicht behoben." - aber der Code, den Sie gepostet haben, spiegelt das nicht wider - haben Sie [assembly: SecurityCritical] zu AssemblyInfo.cpp hinzugefügt? –
Es ist einfach zu trivial, die Anforderung zu umgehen, der Aufrufer kann einfach die Objektreferenz auf den Schnittstellentyp umwandeln und den Aufruf tätigen. Das Attribut muss daher auch auf die Interface-Methode angewendet werden. –
@SebastianRedl Ja. Ich habe nur vergessen, das Attribut hier zu kopieren. Behoben. –