2012-01-31 5 views
5

テストのためにアプリケーションの.NET 4バージョンを作成できますか?はボスの無実の質問でした。System.TypeLoadExceptionが処理されていません/メンバーをオーバーライドしている間に継承セキュリティルールに違反しました

しかし、私は、.NET 4に私たちのWinformsのアプリケーションで私たちの27件のプロジェクトを変更し、再コンパイルした後、アプリを起動したとき、私は

を取得System.TypeLoadExceptionは、未処理
メッセージ= 継承しましたメンバーをオーバーライドしている間にセキュリティ規則が違反しました: 'MyCustomORM.GetObjectData(System.Runtime.Serialization.SerializationInfo、System.Runtime.Serialization.StreamingContext)'。 オーバーライドするメソッドのセキュリティアクセシビリティは、オーバーライドされるメソッドのセキュリティアクセシビリティに一致する必要があります。

うーん.....

MyCustomORMは確かISerializableインタフェースを実装し、したがって、この方法

[Serializable] 
public abstract class MyCustomORM: IMyCustomORM, ISerializable, ICloneable, ISecurable 
{ 
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     // do stuff here....... 
    } 
} 

を持っており、私はまたGetObjectDataを上書きExceptionから派生する2つのクラスを持っています方法。

しかし、何が間違っている可能性がありますか?周りのグーグルで私はいくつかの追加の属性が私の方法および名前空間に固執することが判明 - 私がやった:

[assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution = true)] 
namespace MyApplication.ORM 
{ 
    [Serializable] 
    public abstract class MyCustomORM: IMyCustomORM, ISerializable, ICloneable, ISecurable 
    { 
     [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] 
     public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      // do stuff here....... 
     } 
    } 
} 

が、それは何も変わりません.....

例外も私の最初の行の前に起こります私のstatic Main()メソッドのコードに到達しました....

私はプロジェクトを徹底解読し、古い.NET 1.1ライブラリへの参照を削除しました(はい、そのアプリは古いです.....)。 .NET 4の対応版(主にlog4net)と互換性があります。まだ幸運はありません....

アイデア??

+1

この動作を制御する 'フラグ'があります。どこでも思い出せません。このエラーは、そこに 'virtual'を使用できないことも示しています。 – leppie

+0

また、 'GetObjectData'は、(抽象型のインスタンスに)再インスタンス化できないので、抽象クラスでは意味をなさない。 – leppie

答えて

6

MyCustomORMクラスが存在するアセンブリがSecurityTransparentAttributeでマークされていますか?もしそうなら、問題は.NET 3.5と.NET 4.0の間のセキュリティ透過モデルの変更に起因します。テストのシナリオでは、単純に古い透明メカニズムを使用することをお勧めします。これを行うには、次のアセンブリレベルの属性を追加:レベル1とレベル2の透明性モデルの違いの詳細については

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

を、http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspxを参照してください。

+1

すべてのアセンブリに属性[[assembly:AllowPartiallyTrustedCallers] ' –

+0

があるようです。レベル2のルールの下で、APTCAは、アセンブリ内のすべてのコードがクリティカルとしてマークされていない限り透明として扱われます。 SecurityRulesAttributeを介してレベル1のルールを指定すると、SecurityTransparentAttributeを使用したかのように、すぐに問題に対処する必要があります。 –

1

私はこれがかなり古くなっていることは知っていますが、最近私のアセンブリの1つでこの問題に遭遇しました。これは一部のマシンでのみ発生し、原因を特定するのは非常に困難でした。多くの検索の後、私はVisual Studioに含まれているSecAnnotateツールを実行しました。私は私のアセンブリの一つが問題を引き起こしていたいくつかのセキュリティ属性が含まれていたDLLの古いバージョンを参照していることを決定することができたツールを使用して

Using SecAnnotate to Identify Transparency Violations

。リファレンスを更新して問題を修正しました。

SecAnnotateツールは、間違って見落としたことや知らなかった違反を特定するための優れた方法のようです。

これは誰かを助けることを望みます。

関連する問題