2013-07-10 17 views
8

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セキュリティで停止しています。同じものに対するコード分析の警告を安全に抑制することができます。

+0

"私はこのStackOverflowの答えを示そうとしましたが、それはエラーを修正しませんでした。"(レベル1にロックすると、レベル2が.NET 4.0以降のデフォルトになっているので、 - あなたが投稿したコードにはこれが反映されていません - AssemblyInfo.cppに[assembly:SecurityCritical]を追加しましたか? –

+0

要求をバイパスするのはあまりにも簡単です。呼び出し側はオブジェクト参照をインターフェイスタイプにキャストして呼び出しを行うだけです。したがって、属性はインタフェースメソッドにも適用する必要があります。 –

+0

@SebastianRedlはい。ここで属性をコピーするのを忘れてしまった。修正しました。 –

答えて

9

ここでの根本的な問題は、C#アセンブリとC++アセンブリが2つの異なる透過モデル(2つのレベルの詳細についてはhttp://blogs.msdn.com/b/shawnfa/archive/2009/11/11/transparency-models-a-tale-of-two-levels.aspxhttp://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspxを参照)を使用していることです。これは、C#アセンブリがデフォルトでレベル2にコンパイルされるためですが、C++アセンブリは、明らかに文書化されていない理由のために自動的にコンパイラによってレベル1に強制的に下げられます。残念ながら、後者の動作は優先されないようです。状況を悪化させるために、VS2012では変更されていません。it doesn't look like the product team is considering changing it any time soonあなたがレベル2にC++アセンブリを移動することができないことを、あなたはC++で実行可能ファイルを保持したい場合は、潜在的に実行可能な選択肢のカップルを持って、それはインターフェースの実装が含まれている必要があり考える

  1. 移動C#アセンブリを SecurityRulesAttributeを使用してレベル1に設定します。これはおそらく、 C++コンソールアプリケーションがC#ライブラリの唯一のコンシューマである場合にのみ許容されるでしょう。
  2. セキュリティクリティカル性のレベル2「エスカレーション」を、完全な の信頼リンク/継承要求に再現するには、PermissionSetAttributeを使用します。 例:

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

また、そのコンパイラを要求するためにUserVoiceConnect上の別のバグレポート(クローズドなものに投票することは非常に有用であると思われない)や機能要求を提出する価値があるかもしれません動作が変更されます。

+0

+1お返事ありがとうございます。素晴らしいリンク。私はあなたが言っているのは答えだと思います。これを確認するためにMicrosoftサポートを待つだけです。 –

関連する問題