Использовать отражение для десериализации содержимого игровых бросков MethodAccessException

Я разработал пользовательский XMLDeserializer, который использует отражение для десериализации содержимого моей игры (.xml). Но у меня есть ошибка, что я не понимаю, когда компилируется конвейер контента:

Ошибка 1 Создание содержимого сгенерировало MethodAccessException: не удалось выполнить прозрачный для безопасности метод "DynamicClass.ReflectionEmitUtils(System.Object)" для доступа к критическому методу безопасности "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. Если я вызываю мой метод в консольном приложении, он работает.

Вы можете мне помочь?

Спасибо

1 ответ

Поскольку 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 });
}
Другие вопросы по тегам