.net - किसी प्रबंधित C++/CLI प्रोजेक्ट में CA2123 को ठीक कैसे करें(ओवरराइड लिंक मांगों को आधार के समान होना चाहिए)



.net-4.0 c++-cli (1)

मैं सी ++ / सीएलआई प्रोजेक्ट के लिए CA2123 को ठीक करने का तरीका समझने में सक्षम नहीं हूं। इस मुद्दे को प्रदर्शित करने के लिए यहां एक नमूना प्रोजेक्ट है:

1) एक सी # (.NET 4) कक्षा पुस्तकालय बनाएँ

ManagedClass.cs

नाम स्थान सीएसहरप लाइब्रेरी {

public interface IManagedClass
{
    void WriteSomething();
}

public class ManagedClass : IManagedClass
{
    public void WriteSomething()
    {
    }
}

}

2) एक सी ++ / सीएलआई कंसोल ऐप (वीएस 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 ओवरराइड लिंक मांग आधार के समान होना चाहिए

आधारभूत विधि 'IManagedClass :: WriteSomething (शून्य)' पर एक LinkDemand से मेल करने के लिए निम्न सुरक्षा विशेषता को 'MainClass :: WriteSomething (शून्य)' में जोड़ें: 'SecurityCriticalAttribute'

CPlusPlusCLIConsoleApp cpluspluscliconsoleapp.cpp 13

मैंने इस स्टैक ऑवरफ्लो के उत्तर का अनुसरण करने का प्रयास किया, लेकिन यह त्रुटि को ठीक नहीं किया।

मैं समझता हूं कि प्रबंधित डीएलएल डिफ़ॉल्ट रूप से सुरक्षा क्रिटिकल है (मैं इसे अपने मूल प्रोजेक्ट में बदलना नहीं चाहता) क्योंकि मैं कोई सुरक्षा विशेषता निर्दिष्ट नहीं करता है। क्यों सी + + सीएलआई डीएलएल एक ही डिफ़ॉल्ट का पालन नहीं कर रहे हैं?

इस त्रुटि को ठीक करने के लिए मुझे किन कदमों का पालन करना चाहिए? (मूलतः मैं सी ++ सीआईआई में WriteSomething विधि सुरक्षा क्रिटिकल कैसे कर सकता हूँ)

1 संपादित करें: मैंने एमएसडीएन पर एक ही सवाल पूछा है।

2 संपादित करें: माइक्रोसॉफ्ट से संपर्क किया गया और यह एक डिज़ाइन किया गया व्यवहार है। सी ++ \ सीएलआई टीम के पास सिर्फ सी ++ \ सीएलआई के लिए लेवल 2 सुरक्षा को लागू करने का समय नहीं था। इसलिए सी ++ \ सीएलआई हमेशा स्तर 1 सुरक्षा में फंस गया है। एक ही के लिए कोड विश्लेषण चेतावनी को सुरक्षित रूप से दबा सकता है।


यहां मूल समस्या यह है कि आपकी सी # और सी + + विधानसभाएं दो अलग-अलग पारदर्शिता मॉडल का उपयोग कर रही हैं (देखें http://blogs.msdn.com/b/shawnfa/archive/2009/11/11/transparency-models-a-tale-of दो स्तरों। एस्पक्स और http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx दो स्तरों के विवरण के लिए)। इसका कारण यह है कि सी # असेंबली डिफ़ॉल्ट रूप से स्तर 2 के लिए संकलित करती है, लेकिन सी ++ असेंबली स्वचालित रूप से कुछ स्पष्ट रूप से undocumented कारण के लिए संकलक द्वारा स्तर 1 के लिए नीचे मजबूर हो जाती है। दुर्भाग्यवश, ऐसा लगता है कि उत्तरार्द्ध व्यवहार अतिसार नहीं है चीजों को और भी बदतर बनाने के लिए, यह वीएस2012 में परिवर्तित नहीं हुआ है, और ऐसा नहीं लगता है कि उत्पाद टीम जल्द ही इसे बदलने पर विचार कर रही है

यह देखते हुए कि आप सी ++ असेंबली को लेवल 2 में नहीं ले जा सकते हैं, यदि आपके पास सी ++ में एक्जीक्यूटेबल रखना चाहते हैं और इसमें इंटरफ़ेस का कार्यान्वयन होना आवश्यक है, तो आपके पास कुछ संभावित संभावित विकल्प हैं:

  1. SecurityRulesAttribute के उपयोग के माध्यम से सी # असेंबली को स्तर 1 पर ले जाएं यह संभवतः केवल स्वीकार्य होगा यदि C ++ कंसोल ऐप सी # पुस्तकालय का एकमात्र उपभोक्ता है।
  2. अनुमति के उपयोग के माध्यम से पूर्ण विश्वास लिंक / उत्तराधिकार की मांग के लिए सुरक्षा की गंभीरता के स्तर 2 "वृद्धि" को पुन: उत्पन्न करें। उदाहरण के लिए:

    [SecurityCritical]
    [PermissionSet(SecurityAction::LinkDemand, Unrestricted = true)]
    [PermissionSet(SecurityAction::InheritanceDemand, Unrestricted = true)]
    virtual void WriteSomething();

यह कनेक्ट पर एक और बग रिपोर्ट सबमिट करने के लिए भी उपयुक्त हो सकता है (बंद वाले लोगों के लिए वोटिंग बहुत उपयोगी नहीं लगता है) या उपयोगकर्ता के अनुरोध पर एक सुविधा अनुरोध को संकलक व्यवहार बदला जाना (स्तर 1 में लॉकिंग काफी सुस्त है, उस स्तर 2 को नेट 4.0 और अधिक के लिए डिफ़ॉल्ट माना जाता है।)





code-access-security