2010-06-18 2 views
39

Ich habe einen benutzerdefinierten Konfigurationsabschnitt mit XSD erstellt. Um die Konfigurationsdatei zu analysieren, die dieses neue Schema folgt, lade ich die Ressource (meine XSD-Datei) mit diesem:Kann eine Manifest-Ressource nicht mit GetManifestResourceStream() laden

public partial class MonitoringConfiguration 
    { 
     public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd"; 
     public const string ConfigSchema = "urn:MonitoringConfiguration-1.0"; 

     private static XmlSchemaSet xmlSchemaSet; 

     static MonitoringConfiguration() 
     { 
      xmlSchemaSet = new XmlSchemaSet(); 
      Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd); 
      XmlReader schemaReader = XmlReader.Create(xsdStream); 
      xmlSchemaSet.Add(ConfigSchema, schemaReader); 
     } 

    } 

Durch die Art und Weise meiner Ressource ist: MonitoringConfiguration.xsd. Und der Namespace der anderen partiellen Klasse (die den Code hinter der .xsd-Datei darstellt) ist MonitoringAPI.Configuration.

Das Problem befindet sich hier:

Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd); 

Die xsdStream null ist, so dass ich denke, die Ressource nicht gefunden werden! Aber warum?

Danke

Antwort

75

Der Name der Ressource ist immer:

<Base namespace>.<RelativePathInProject>.<FileName>

Also, wenn Ihre Ressource in "Resources/Xsd /", und Ihr Standard-Projektnamespace befindet, ist „MonitoringAPI. Konfiguration“, der Ressourcenname ist:

"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"

auch sicherstellen, dass die Build-a ction für Ihre Ressource wird auf „Ressourcen Embedded“

+0

befindet sich im selben Verzeichnis wie diese Klasse. –

+1

Klicken Sie mit der rechten Maustaste auf die Datei und wählen Sie "Eigenschaften". –

+0

Danke das war das Problem!Ich verbrachte einen halben Tag damit, das Problem herauszufinden, und Sie lösten es in einer Minute;) –

8

standardmäßig nicht Visual Studio nicht XSD-Datei einbetten deshalb müssen Sie sicherstellen, „Build-Aktion“ Eigentum der XSD-Datei wird auf „Ressourcen Embedded“, um es funktioniert zu machen

48

einfache und korrekte Art und Weise die tatsächlichen Namen Ihrer Embedded-Ressource erhalten:

string[] resourceNames = 
    Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

Dann einfach Resource Array überprüfen, und Sie werden sicher wissen, was zu GetManifestResourceStream Methode zu übergeben.

+2

Zum user1958681 ... JA !!! In meinem Fall waren die Ressourcenpfade "nicht standardisiert", in dem Sinne, dass sie in ihren Namen nicht das Ressourcen-Unterverzeichnis hatten. Der Array-Trick war perfekt, um die richtige Benennung zu kennen. Danke vielmals!! –

+0

Mine hatte auch nicht das Subdir in ihren Namen. Weiß jemand warum? –

+1

Ich fand gerade 'Assembly.GetExecutingAssembly(). GetManifestResourceNames();' im Zwischenfenster, während das Debuggen genug war. Gibt eine schöne formatierte Ausgabe, die leicht zu lesen ist. – Lankymart

8

In meinem Fall

Wenn Sie versuchen, die Datei über GetManifestResourceStream() zuzugreifen. Sie erhalten einen Fehler aufgrund des ungültigen Pfades der Datei, und der Stream wird null sein.

Lösung:

Rechtsklick auf die Datei, die Sie sich in Lösung hinzugefügt haben, und klicken Sie auf Eigenschaften.

Wählen Sie Build Action als Embedded Resource. (Statt Content - standardmäßig)

Build action property set to embedded resource

4

fügen Sie einfach Ihre Ressourcen unter Form1.resx -> fügen vorhandene Elemente

Doppelklick auf die Ressourcen, die Sie unter Ressourcen hinzugefügt folder.go zu Eigenschaften und Wählen Sie "Embedded Resources" statt keiner.

Dann versuchen Debuggen der Zeile:

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

Prüfung Ressourcen, die Sie in dem Array hinzugefügt. Kopieren Sie dann den Ressourcennamen genau aus diesem Array und versuchen Sie, den Namen auf Ihren Code zu setzen ... es funktioniert einwandfrei !!

1

Sie können die Ressource-Stream erhalten, indem die Resource Names vorbei, die unten wie folgt ...

ist
  1. Holen Sie den Ressourcennamen zB.

    Assembly objAssembly = Assembly.GetExecutingAssembly();

    string [] strResourceNames = objAssembly.GetManifestResourceNames();

  2. Führen Sie die Resource Names zu ...

    Stream-strm = objAssembly.GetManifestResourceStream (strResourceNames);

Jetzt haben Sie Strom Sie tun können, was Sie wollen ...

0

In meinem Fall war es etwas ganz anderes:

My UWP App korrekt in Debug kompiliert und Release-Konfiguration, aber GetManifestResourceStream gab Nur-Null-Konfiguration zurück.

Das Problem war, dass in der UWP Build Konfigurationsdatei (und nur dort) die Einstellung "Kompilieren mit. NET Native Werkzeugkette" aktiviert wurde. Nach der Deaktivierung funktionierte GetManifestResourceStream wie erwartet.

0

Ich hatte ein Problem, bei dem ich einen ganzen Haufen von .xsd-Dateien in viele verschiedene Assemblies eingebettet hatte; Alles funktionierte (GetManifestResourceNames gab die Dateien zurück, die ich erwarten würde), außer einem. Die eine, die wurde nicht genannt:

Something.LA.xsd 

Ich war nicht mit spezifischen Kulturen und den .LA Bit am Ende des Dateinamen zu tun wurde durch den Compiler aufgenommen, da diese Datei für die Kultur LA zu sein - Der Dateiname im Manifest ging als Something.xsd (unter Kultur LA) ein - daher konnte ich ihn nicht finden (er landete in einer Satelliten-Assembly). Ich wich dem Problem aus, indem ich die Datei umbenannte - vermutlich ist es möglich, die Kultur einer gegebenen eingebetteten Ressource explizit anzugeben.

Eigentlich eine schnelle Google enthüllt: How can I prevent embedded resource file culture being set based on its filename

zu dieser Antwort Laut, haben Sie Hacky Dinge tun - so vielleicht die Datei war die Umbenennung nicht so schlecht, nachdem alle meine Ressource :)