1

我开发了一个自定义 XMLDeserializer,它使用反射来反序列化我的游戏 (.xml) 的内容。但是我有一个错误,我在内容管道编译时没有弄清楚:

错误 1 ​​构建内容抛出 MethodAccessException:尝试通过安全透明方法“DynamicClass.ReflectionEmitUtils(System.Object)”访问安全关键方法“System.Reflection.Assembly.get_PermissionSet()”失败。

程序集 'mscorlib, Version=4.0.0.0, Culture=neutral, 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 程序集中调用代码的权限。如果我在控制台应用程序中调用我的方法,它就可以工作。

你能帮助我吗?

谢谢

4

1 回答 1

0

由于IListIDictionary是通用的,也许您没有找到正确的方法,或者试图将错误的类型传递给它们?他们的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 });
}
于 2013-09-29T00:11:00.243 回答