2010-06-18 15 views
39

Utworzono niestandardową sekcję konfiguracji za pomocą XSD. W celu analizowania pliku konfiguracyjnego, który następuje tego nowego schematu, załadować zasób (mój plik .XSD) z tego:Nie można załadować zasobu manifestu za pomocą metody GetManifestResourceStream()

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); 
     } 

    } 

Nawiasem mówiąc mój zasób jest: MonitoringConfiguration.xsd. A przestrzeń nazw drugiej klasy częściowej (która reprezentuje kod pliku .xsd) to MonitoringAPI.Configuration.

Problem leży tutaj:

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

xsdStream jest zerowy, więc myślę, że zasób nie można znaleźć! Ale dlaczego?

Dziękuję

Odpowiedz

75

Nazwa zasobu jest zawsze:

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

Więc jeśli Twój zasób znajduje się w "Resources/XSD /", a swoim nazw domyślny projektu jest „MonitoringAPI. konfiguracja”, nazwa zasobu jest:

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

Upewnij się także kompilacja ction do zasobu jest ustawiony na „Embedded Resource”

+0

Mój zasób znajduje się w tym samym katalogu, co ta klasa. –

+1

Kliknij plik prawym przyciskiem myszy i wybierz "Właściwości". –

+0

Dzięki, że to był problem!Spędziłem pół dnia zastanawiając się nad problemem i rozwiązałeś go za chwilę;) –

8

Domyślnie visual studio nie osadzać xsd plik dlatego trzeba zapewnić „Budowanie akcji” własność pliku XSD jest ustawiony na „Embedded Resource”, aby uczynić to działa

48

Łatwe i poprawny sposób, aby uzyskać rzeczywistą nazwę osadzonego zasobu:

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

Następnie wystarczy sprawdzić resourceNames tablicę, a będziesz wiedzieć na pewno, co do przekazania do metody GetManifestResourceStream.

+2

Do użytkownika1958681 ... TAK !!! W moim przypadku ścieżki zasobów były "niestandardowe", w tym sensie, że nie miały zasobów pod-dir w ich nazwach. Sztuczka podstępna była idealna, by znać właściwą nazwę. Wielkie dzięki!! –

+0

Mój nie miał również podrozdziału w ich nazwach. Czy ktoś wie, dlaczego? –

+1

Znalazłem po prostu uruchomiony 'Assembly.GetExecutingAssembly(). GetManifestResourceNames();' w oknie pośrednim, podczas gdy debugowanie było wystarczające. Daje ładne sformatowane wyjście, które jest łatwe do odczytania. – Lankymart

8

W moim przypadku

Podczas próby uzyskania dostępu do pliku przez GetManifestResourceStream(). Otrzymasz błąd z powodu nieprawidłowej ścieżki pliku, a strumień będzie mieć wartość NULL.

Rozwiązanie:

prawym przyciskiem myszy na pliku, który został dodany do roztworu i kliknij przycisk Właściwości.

Wybierz Build Action jako Embedded Resource. (Zamiast Content - domyślnie)

Build action property set to embedded resource

4

wystarczy dodać swoje zasoby pod form1.resx -> dodaj istniejące elementy

podwójne kliknięcie na zasobach dodanych pod Zasobów folder.go do właściwości i wybierz "Osadzone zasoby" zamiast żadnego.

Następnie spróbować debugowania linię:

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

Sprawdź materiały zostały dodane są w tablicy. następnie skopiuj nazwę zasobu dokładnie z tej tablicy i spróbuj umieścić nazwę na swoim kodzie. działa dobrze !!

1

można uzyskać Resource strumienia przez przepuszczanie nazwy zasobów brzmi następująco poniżej ...

  1. uzyskać nazwę zasobu, np.

    Zgromadzenie objAssembly = Assembly.GetExecutingAssembly();

    string [] strResourceNames = objAssembly.GetManifestResourceNames();

  2. Przepuścić nazwy zasobów do ...

    Stream STRM = objAssembly.GetManifestResourceStream (strResourceNames);

Teraz masz Stream możesz robić, co chcesz ...

0

W moim przypadku było to coś zupełnie innego:

Moja UWP App skompilowany poprawnie i Debug Zwolnij konfigurację, ale GetManifestResourceStream zwróciło pustą konfigurację wydania.

Problem polegał na tym, że w pliku konfiguracji kompilacji UWP (i tylko tam) zostało włączone ustawienie "Kompilacja z .NET Macierzystym łańcuchem narzędzi". Po wyłączeniu GetManifestResourceStream działało zgodnie z oczekiwaniami.

0

Wystąpił problem polegający na tym, że osadzałem całą masę plików .xsd w wielu różnych złożeniach; wszystko działało (GetManifestResourceNames zwrócił pliki, których się spodziewałam) z wyjątkiem jednego. Ten, który nie został powołany:

Something.LA.xsd 

nie miał do czynienia z konkretnych kultur i bitu .la, którego na końcu nazwy pliku był podejmowany przez kompilator jako plik ten jest dla kultury LA - nazwa pliku w manifeście wchodziła w coś Coś.xsd (w kulturze LA) - stąd nie jestem w stanie go znaleźć (skończyło się na montażu satelitarnym). Uniknąłem problemu, zmieniając nazwę pliku - przypuszczalnie możliwe jest jawne określenie kultury danego zasobu osadzonego.

Właściwie szybkie google ujawnia: How can I prevent embedded resource file culture being set based on its filename

Według tej odpowiedzi, masz zrobić hacky rzeczy - więc być może zmiana nazwy pliku nie było tak źle :)

Powiązane problemy