2013-09-27 1 views
1

리플렉션을 사용하여 내 게임 (.xml)의 내용을 deserialize하는 사용자 지정 XMLDeserializer를 개발했습니다. 'DynamicClass.ReflectionEmitUtils (은 System.Object)' 보안 투명한 방법으로 시도 : 1 개 건물의 내용에서는 MethodAccessException 던졌다리플렉션을 사용하여 게임 던지 내용을 deserialize합니다. MethodAccessException

오류 :하지만 콘텐츠 파이프 라인은 컴파일 할 때 내가 그것을 알아낼 수없는 오류가 보안에 액세스하려면 중요한 메서드 'System.Reflection.Assembly.get_PermissionSet()' 이 실패했습니다.

총회 '중립 mscorlib에, 버전 = 4.0.0.0, 문화 = PublicKeyToken = b77a5c561934e089'는 AllowPartiallyTrustedCallersAttribute로 표시하고, 레벨 2 보안 투명성 모델을 사용합니다. 수준 2 투명성을 적용하면 AllowPartiallyTrustedCallers 어셈블리의 모든 메서드가 기본적으로이 예외의 원인이 될 수있는 보안 투명 이됩니다. 이 코드를 주석 경우

오류가 발생하지 않습니다

// Add item to the collection 
if (typeof(IList).IsAssignableFrom(collectionType)) 
{ 
    collectionType.GetMethod("Add").Invoke(collectionObject, new[] { itemObject }); 
} 
else if (typeof(IDictionary).IsAssignableFrom(collectionType)) 
{ 
    collectionType.GetMethod("Add").Invoke(collectionObject, new[] { itemType, itemObject }); 
} 

내 어셈블리가 mscorlib에 어셈블리 코드를 호출 할 수있는 권한이없는 것 같습니다. 콘솔 응용 프로그램에서 내 메서드를 호출하면 작동합니다.

도와 주시겠습니까?

감사

답변

0
IList 이후

IDictionary는 일반, 어쩌면 당신은 올바른 방법을 찾는되지 않았거나 그들에게 잘못된 유형을 통과하려고? 해당 Add 메서드는 해당 제네릭 형식으로 강력한 형식이 지정됩니다. 매개 변수 유형을 지정하지 않았으므로 Add 오버로드가 잘못되었을 수도 있습니다. 다음과 같이 할 수도 있습니다.

// Add item to the collection 
if (typeof(IList).IsAssignableFrom(collectionType)) { 
    var addMethod = collectionType.GetMethod("Add", new[] { itemObject.GetType() }); 
    if (addMethod == null) 
     throw new SerializationException("Failed to find expected IList.Add method."); 
    addMethod.Invoke(collectionObject, new[] { itemObject }); 
} else if (typeof(IDictionary).IsAssignableFrom(collectionType)) { 
    var addMethod = collectionType.GetMethod("Add", new[] { typeof(Type), itemObject.GetType()} 
    if (addMethod == null) 
     throw new SerializationException("Failed to find expected IDictionary.Add method."); 
    addMethod.Invoke(collectionObject, new[] { itemType, itemObject }); 
} 
+0

그 중 하나는 작동하지 않습니다. 문제는 코드 자체가 아닙니다. 왜냐하면 콘솔 응용 프로그램 내에서 'Deserialize'메서드를 호출하면 작동하기 때문입니다. 하지만 ContentPipelineExtension 프로젝트에서 호출하면 작동하지 않습니다. – Xxbz

관련 문제