Nie jestem w stanie zrozumieć, jak naprawić kod CA2123 dla projektu C++/CLI. Oto przykładowy projekt do wykazania problem:Jak naprawić kod CA2123 (Przesłania łącza żądania powinny być identyczne z bazą) w zarządzanym projekcie C++/CLI
1) Utwórz C# (.NET 4) Class Library
ManagedClass.cs
nazw CSharpLibrary {
public interface IManagedClass
{
void WriteSomething();
}
public class ManagedClass : IManagedClass
{
public void WriteSomething()
{
}
}
}
2) Utwórz aplikację konsoli 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()
{
}
};
Po enab ling wszystkich reguł zabezpieczeń firmy Microsoft, mam to ostrzeżenie:
żądania łącza CA2123 Zastąp powinny być identyczne oprzeć
Dodaj następujący atrybut zabezpieczeń 'MainClass :: WriteSomething (void)' w celu dopasowania LinkDemand na metoda podstawowa "IManagedClass :: WriteSomething (void)": "SecurityCriticalAttribute".
CPlusPlusCLIConsoleApp cpluspluscliconsoleapp.cpp 13
Starałem się śledzić, co to StackOverflow answer sugeruje, ale nie naprawić błąd.
Rozumiem, że zarządzana biblioteka dll jest domyślnie SecurityCritical (nie chcę tego zmieniać w moim oryginalnym projekcie), ponieważ nie określam żadnej SecurityAttribute. Dlaczego biblioteka CLI języka C++ nie jest zgodna z tym samym ustawieniem domyślnym?
Co należy zrobić, aby naprawić ten błąd? (W zasadzie, jak mogę uczynić metoda WriteSomething SecurityCritical w C++ CLI)
EDIT 1: Mam to samo pytanie na MSDN.
EDYCJA 2: Skontaktowano się z firmą Microsoft i jest ona zgodna z założeniami. Zespół C++ \ CLI po prostu nie miał czasu na wdrożenie Level2 Security for C++ \ CLI. Stąd C++ \ CLI zawsze utknął na poziomie 1 Security. Można bezpiecznie ukryć ostrzeżenie o analizie kodu dla tego samego.
"Próbowałem zastosować się do sugestii StackOverflow, ale nie naprawiłem błędu." - ale kod, który wysłałeś, nie odzwierciedla tego - czy dodałeś [assembly: SecurityCritical] do AssemblyInfo.cpp? –
Po prostu zbyt trywialne, aby ominąć żądanie, osoba dzwoniąca może po prostu rzucić referencję obiektu do typu interfejsu i wykonać połączenie. Dlatego atrybut musi być również zastosowany do metody interfejsu. –
@SebastianRedl Tak. Właśnie zapomniałem skopiować ten atrybut tutaj. Naprawione. –