2012-01-31 2 views
5

테스트 용 .NET 4 버전의 테스트를 만들 수 있습니까?은 보스의 무고한 질문이었습니다. 내가 .NET 4 우리 윈폼 응용 프로그램에서 우리의 27 개 프로젝트를 변경하고 재 컴파일 후 응용 프로그램을 실행할 때System.TypeLoadException 처리되지 않음/상속 보안 규칙 위반 구성원을 무시하는 동안

는하지만, 나는

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를 오버라이드 (override) Exception에서 파생 된 두 개의 클래스가 않습니다 방법.

하지만 무엇이 잘못 될 수 있습니까 ??

예외가 첫 줄 앞에도 발생 .....

[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

나는 이것이 꽤 오래되었다는 것을 알고 있지만 최근에 내 어셈블리 중 하나와 함께이 문제에 부딪혔다. 일부 시스템에서만 발생했기 때문에 원인을 판별하기가 매우 어려웠습니다. 보안 규칙 조정을 넣고 싶지 않았기 때문에 많은 검색을 한 후에 Visual Studio에 포함 된 SecAnnotate 도구를 실행했습니다.내 어셈블리 중 하나가 문제의 원인이 된 몇 가지 보안 속성을 포함 된 DLL의 이전 버전을 참조하는 것을 확인할 수 있었다 도구를 사용하여

Using SecAnnotate to Identify Transparency Violations

. 참조를 업데이트하면 문제가 해결되었습니다.

SecAnnotate 도구는 실수로 간과하거나 모르는 위반 사항을 식별하는 좋은 방법 인 것 같습니다.

희망이 있으면 도움이됩니다.

관련 문제