C++/CLIプロジェクトのCA2123の修正方法を理解できません。ここでは、問題を実証するサンプルプロジェクトです:管理対象のC++/CLIプロジェクトでCA2123を修正する方法(リンク要求のオーバーライドはベースと同じにする必要があります)
1)のC#を作成します(.NET 4)クラスライブラリ
ManagedClass.cs
名前空間CSharpLibrary {
public interface IManagedClass
{
void WriteSomething();
}
public class ManagedClass : IManagedClass
{
public void WriteSomething()
{
}
}
}
2)C++/CLIコンソールアプリケーションを作成する(VS 2010):
ENAB後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()
{
}
};
一致させるために
CA2123オーバーライドリンクの需要が に以下のセキュリティ属性を追加
をベースに同一でなければならない「MainClass :: WriteSomething(ボイド)」:玲すべてのMicrosoftセキュリティルールは、私はこの警告を取得しますLinkDemand on 基本メソッド 'IManagedClass :: WriteSomething(void)': 'SecurityCriticalAttribute'。
CPlusPlusCLIConsoleApp cpluspluscliconsoleapp.cpp 13
私はこのStackOverflow answerが提案ものをフォローしようとしたが、それはエラーを修正しませんでした。
私はSecurityAritributeを指定していないので、マネージdllはデフォルトでSecurityCritical(元のプロジェクトでこれを変更したくないということ)を理解しています。 C++ CLI DLLが同じデフォルトに従わないのはなぜですか?
このエラーを解決するための手順はありますか。 (基本的には、C++ CLIでWriteSomethingメソッドSecurityCriticalメソッドを作成できます)
EDIT 1:私はMSDNで同じ質問をしました。
EDIT 2:マイクロソフトに連絡しても、設計通りの動作です。 C++ \ CLIチームは、C++ \ CLI用のLevel2セキュリティを実装する時間がありませんでした。したがって、C++ \ CLIは常にLevel1セキュリティで停止しています。同じものに対するコード分析の警告を安全に抑制することができます。
"私はこのStackOverflowの答えを示そうとしましたが、それはエラーを修正しませんでした。"(レベル1にロックすると、レベル2が.NET 4.0以降のデフォルトになっているので、 - あなたが投稿したコードにはこれが反映されていません - AssemblyInfo.cppに[assembly:SecurityCritical]を追加しましたか? –
要求をバイパスするのはあまりにも簡単です。呼び出し側はオブジェクト参照をインターフェイスタイプにキャストして呼び出しを行うだけです。したがって、属性はインタフェースメソッドにも適用する必要があります。 –
@SebastianRedlはい。ここで属性をコピーするのを忘れてしまった。修正しました。 –