में सीए 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 सुरक्षा पर फंस गया है। कोई भी इसके लिए कोड विश्लेषण चेतावनी को सुरक्षित रूप से दबा सकता है।
"मैंने इस स्टैक ओवरफ्लो उत्तर का सुझाव देने का प्रयास किया लेकिन यह त्रुटि को ठीक नहीं किया।" - लेकिन आपके द्वारा पोस्ट किया गया कोड इस पर प्रतिबिंबित नहीं करता है - क्या आपने [असेंबली: सुरक्षाक्रिटिकल] को AssemblyInfo.cpp में जोड़ा था? –
मांग को बाईपास करना बहुत छोटा है, कॉलर बस इंटरफ़ेस प्रकार के ऑब्जेक्ट संदर्भ को कास्ट कर सकता है और कॉल कर सकता है। इस प्रकार विशेषता को इंटरफ़ेस विधि पर भी लागू किया जाना चाहिए। –
@ सेबेस्टियन रेडल हां। मैं सिर्फ विशेषता को कॉपी करना भूल गया था। ठीक कर दिया। –