Элемент управления XNA ActiveX - не удается найти пользовательский ContentReader при работе в IE - PullRequest
2 голосов
/ 29 ноября 2010

Что у меня есть

MyGraphicsLibrary.Content.Pipeline.dll

public class MyModelProcessor { }
public class MyModelContent { }

[ContentTypeWriter]
public class MyModelContentWriter : ContentWriter<MyModelContent>
{
   protected override void Write(ContentWriter output, MeshDataContent value)
   {
       value.Write(output);
   }

   public override string GetRuntimeType(TargetPlatform targetPlatform)
   {
       return "MyGraphicsLibrary.MyModel, MyGraphicsLibrary";
   }

   public override string GetRuntimeReader(TargetPlatform targetPlatform)
   {
       return "MyGraphicsLibrary.MyModelReader, MyGraphicsLibrary";
   }
}

MyGraphicsLibrary.dll: строго названо

public class GraphicsDeviceControl : System.Windows.Forms.Panel { }
public class MyModel { }
public class MyModelReader : ContentTypeReader<MyModel> { }

GraphicsDeviceControl основан на этот образец XNA .
ActiveXApplication.dll: строго назван, зарегистрирован для COM-взаимодействия

 [Guid("")]
 [ProgId("ActiveXApplication.ActiveXControl")]
 [ComVisible(true)]
 public class ActiveXControl : System.Windows.Forms.UserControl { }
 public class MyGraphicsDeviceControl : MyGraphicsLibrary.GraphicsDeviceControl { }

ActiveXControl является основным пользовательским интерфейсом приложения I 'встраивание в IE7 / 8 с тегом <object>.Сайт, на котором размещен элемент управления, был добавлен в доверенные сайты.MyGraphicsDeviceControl загружает модели на основе информации, переданной на ActiveXControl с веб-страницы.Загруженные модели были созданы из моделей FBX с MyModelProcessor и написаны с MyModelContentWriter.В настоящее время я использую XNA 3.0.

Проблема

Когда MyGraphicsDeviceControl выполняет следующую строку:

this.contentManager.Load<MyModel>("modelName")

Я получаю следующую ошибку:

Ошибка загрузки «pathToModel \ modelName».Не удается найти ContentTypeReader MyGraphicsLibrary.MyModelReader, MyGraphicsLibrary.

Эта ошибка не возникает при использовании ActiveXControl в приложении Windows Forms.При использовании классов модели XNA по умолчанию ошибка не возникает (я пытаюсь использовать класс пользовательской модели, а не злоупотреблять свойством Tag класса модели XNA).Используя Reflector, я проследил через ContentManager.Load<T> в поисках источника исключения и обнаружил, что это происходит, когда XNA пытается вызвать Type.GetType(), используя строку, определенную в MyModelContentWriter.GetRuntimeReader(), которая возвращает ноль.

Вопрос

Есть мысли о том, почему Type.GetType () возвращает ноль при попытке загрузить MyModelReader, а не ModelReader XNA при работе в IE?

ОБНОВЛЕНИЕ:

Изучив эту проблему еще раз, я смог найти способ загрузить свой пользовательский класс модели при работе в IE.Добавив обработчик для AppDomain.AssemblyResolve, я смог вернуть сборку, содержащую MyModelReader, что позволило успешно выполнить вызов Type.GetType() в коде XNA.

На основе информации, которую я прочитал о Reflection и сборкезагружая, я предполагаю, что смог использовать класс модели XNA без проблем, потому что сборки XNA зарегистрированы в GAC, где, как у меня, нет.Однако MyGraphicsLibrary.dll уже был загружен в AppDomain, поэтому я не совсем уверен, почему не удалось разрешить сборку.Я предполагаю, что это как-то связано с контекстом, в котором он был загружен, но я не уверен, в какой контекст загружаются сборки при работе в IE.

Ответы [ 2 ]

0 голосов
/ 25 января 2011

Вы пытались использовать полное, полное имя сборки тип вашего устройства чтения контента?Я заметил, что переопределение GetRuntimeReader вашего автора контента не указывает токен открытого ключа, культуру или версию.

У меня были такие же проблемы, как у вас, и все они были вызваны не мнойправильное указание типа среды выполнения.

Это можно получить с помощью typeof(<your content reader type>).AssemblyQualifiedName.

Метод Type.GetType(string) возвращает ноль, когда не удается найти тип, поэтому:

  1. передаваемая строка не дает полностью определенного типа имени (это мое предположение), или

  2. Сборка, содержащая тип, не былазагружается в контексте времени выполнения приложения, из которого вы пытаетесь загрузить контент.Вы добавили ссылку на расширение вашего конвейера контента в основной проект?

0 голосов
/ 07 декабря 2010

установить ContentManager.RootDirctory в абс-путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...