2013-07-10 6 views
8

में सीए 2123 (ओवरराइड लिंक मांगों को आधार के समान होना चाहिए) को कैसे ठीक किया जाए, मैं समझ नहीं पा रहा हूं कि सी ++/सीएलआई प्रोजेक्ट के लिए CA2123 को कैसे ठीक किया जाए। यहाँ मुद्दा प्रदर्शित करने के लिए एक नमूना परियोजना है:एक प्रबंधित सी ++/सीएलआई प्रोजेक्ट

1) एक सी # बनाएं (.NET 4) कक्षा लाइब्रेरी

ManagedClass.cs

नाम स्थान CSharpLibrary {

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() 
    { 
    } 
}; 

enab के बाद आदेश से मिलान करने में

CA2123 अवहेलना लिंक मांगों

आधार पर के लिए निम्न सुरक्षा विशेषता जोड़ें समान होना चाहिए 'MainClass :: WriteSomething (शून्य)': लिंग सभी Microsoft सुरक्षा नियम, मैं इस चेतावनी मिल आधार विधि 'IManagedClass :: लिखें कुछ (शून्य)': 'सुरक्षा क्रिटिकल एट्रिब्यूट' पर एक लिंकडेमांड।

CPlusPlusCLIConsoleApp cpluspluscliconsoleapp.cpp 13

मैं क्या इस StackOverflow answer सुझाव दिया, लेकिन यह त्रुटि को ठीक नहीं किया पालन करने की कोशिश की।

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

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

संपादित करें 1: मैं MSDN पर एक ही प्रश्न पूछा है।

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

+0

"मैंने इस स्टैक ओवरफ्लो उत्तर का सुझाव देने का प्रयास किया लेकिन यह त्रुटि को ठीक नहीं किया।" - लेकिन आपके द्वारा पोस्ट किया गया कोड इस पर प्रतिबिंबित नहीं करता है - क्या आपने [असेंबली: सुरक्षाक्रिटिकल] को AssemblyInfo.cpp में जोड़ा था? –

+0

मांग को बाईपास करना बहुत छोटा है, कॉलर बस इंटरफ़ेस प्रकार के ऑब्जेक्ट संदर्भ को कास्ट कर सकता है और कॉल कर सकता है। इस प्रकार विशेषता को इंटरफ़ेस विधि पर भी लागू किया जाना चाहिए। –

+0

@ सेबेस्टियन रेडल हां। मैं सिर्फ विशेषता को कॉपी करना भूल गया था। ठीक कर दिया। –

उत्तर

9

मूल समस्या यह है कि आपकी सी # और सी ++ असेंबली दो अलग-अलग पारदर्शिता मॉडल का उपयोग कर रही हैं (दो स्तरों के विवरण के लिए http://blogs.msdn.com/b/shawnfa/archive/2009/11/11/transparency-models-a-tale-of-two-levels.aspx और http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx देखें)। ऐसा इसलिए है क्योंकि सी # असेंबली डिफ़ॉल्ट रूप से स्तर 2 तक संकलित होती है, लेकिन सी ++ असेंबली को कुछ स्पष्ट रूप से अनियंत्रित कारणों के लिए संकलक द्वारा स्वचालित रूप से स्तर 1 तक मजबूर कर दिया जाता है। दुर्भाग्यवश, ऐसा लगता है कि बाद का व्यवहार अतिसंवेदनशील नहीं है। चीजों को और खराब करने के लिए, ऐसा लगता है कि यह VS2012 में बदल गया है, और it doesn't look like the product team is considering changing it any time soon

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

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

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

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

+0

+1 आपके उत्तर के लिए धन्यवाद। महान लिंक मुझे लगता है कि आप क्या कह रहे हैं जवाब है। इसकी पुष्टि करने के लिए बस माइक्रोसॉफ्ट समर्थन की प्रतीक्षा कर रहा है। –

संबंधित मुद्दे