2010-11-29 6 views
2

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.

Antwort

0

setzen Sie ContentManager.RootDirctory auf ABS-Pfad.

+0

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. –

0

Haben Sie versucht, den vollständigen, qualifizierten Namen des Typs Ihres Inhaltslesers zu verwenden? Ich habe festgestellt, dass die Überschreibung des Inhaltsautors GetRuntimeReader kein Token für öffentliche Schlüssel, eine Kultur oder eine Version angibt.

Ich habe vor Problemen wie ich gehabt, und alle von ihnen verursacht wurden, nicht von mir den Laufzeittyp korrekt angeben.

Dies kann über typeof(<your content reader type>).AssemblyQualifiedName erhalten werden.

Die Type.GetType(string) Methode gibt null zurück, wenn es nicht die Art finden können, so:

  1. die Zeichenfolge, die den vollqualifizierten Typ des Namens nicht geben übergeben wird wird (das ist meine Vermutung), oder

  2. die hat enthaltende Assembly Typen nicht in dem Laufzeitkontext der Anwendung versucht man von Inhalt zu laden geladen. Haben Sie einen Verweis auf Ihre Content-Pipeline-Erweiterung zu Ihrem Hauptprojekt hinzugefügt?