läuft Was Ich habeXNA ActiveX Control - Kann benutzerdefinierte Contentreader finden, wenn in IE
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: Stark Named
public class GraphicsDeviceControl : System.Windows.Forms.Panel { }
public class MyModel { }
public class MyModelReader : ContentTypeReader<MyModel> { }
GraphicsDeviceControl
basiert auf this XNA sample.
ActiveXApplication.dll: Stark benannt, Schrieb für COM-Interop
[Guid("")]
[ProgId("ActiveXApplication.ActiveXControl")]
[ComVisible(true)]
public class ActiveXControl : System.Windows.Forms.UserControl { }
public class MyGraphicsDeviceControl : MyGraphicsLibrary.GraphicsDeviceControl { }
ActiveXControl
ist der Haupt-UI für die Anwendung in IE7/8 mit dem <object>
Tag Einbettung ich bin. Die Site, auf der das Steuerelement gehostet wird, wurde zu vertrauenswürdigen Sites hinzugefügt. MyGraphicsDeviceControl
lädt Modelle basierend auf Informationen, die von der Webseite an ActiveXControl
übergeben werden. Die geladenen Modelle wurden von FBX-Modellen mit MyModelProcessor
erstellt und mit MyModelContentWriter
geschrieben. Ich verwende derzeit XNA 3.0.
Das Problem
Wenn MyGraphicsDeviceControl
die folgende Zeile ausführt:
this.contentManager.Load<MyModel>("modelName")
ich die folgende Fehlermeldung:
Error loading "pathToModel\modelName". Cannot find ContentTypeReader MyGraphicsLibrary.MyModelReader, MyGraphicsLibrary.
Dieser Fehler tritt nicht auf, wenn ActiveXControl
in einem Windows verwenden Formularanwendung Bei Verwendung der XNA-Standardmodellklassen tritt der Fehler nicht auf (ich versuche, die benutzerdefinierte Modellklasse zu verwenden, anstatt die Tag-Eigenschaft der XNA Model-Klasse zu missbrauchen). Unter Verwendung von Reflector verfolgte ich ContentManager.Load<T>
auf der Suche nach der Quelle der Ausnahme und fand es, wenn XNA versucht, Type.GetType()
unter Verwendung der in MyModelContentWriter.GetRuntimeReader()
definierten Zeichenfolge aufzurufen, die null zurückgibt.
Die Frage
Irgendwelche Gedanken darüber, warum Type.GetType() null zurückkehrt, wenn MyModelReader zu laden versuchen und ModelReader die nicht XNA wenn in IE ausgeführt wird?
UPDATE:
Nach einem Blick in die Ausgabe etwas mehr, ich war in der Lage, einen Weg zu finden, um meine benutzerdefinierte Modellklasse zu erhalten zu laden, wenn im Internet Explorer ausgeführt wird. Durch Hinzufügen eines Handlers für AppDomain.AssemblyResolve
konnte ich die Assembly mit MyModelReader
zurückgeben, die den Aufruf Type.GetType()
im XNA-Code ermöglichte.
Basierend auf den Informationen, die ich über Reflection und Assembly Loading gelesen habe, gehe ich davon aus, dass ich die XNA-Model-Klasse problemlos verwenden konnte, da die XNA-Assemblys im GAC registriert sind. MyGraphicsLibrary.dll
wurde jedoch bereits in AppDomain
geladen, daher bin ich mir nicht ganz sicher, warum die Assembly nicht aufgelöst werden konnte. Ich nehme an, dass es etwas mit dem Kontext zu tun hat, in dem es geladen wurde, aber ich bin nicht sicher, in welchem Kontext die Assemblys geladen werden, wenn sie in IE ausgeführt werden.
Das RootDirectory des ContentManagers ist hier nicht das Problem; Die inneren Abläufe der Inhaltspipeline finden den Inhalt in seinem Rohformat .xnb, können aber den Typ, der für die Deserialisierung in eine Instanz des Zieltyps erforderlich ist, nicht finden. –