2010-06-18 44 views
39

我已經使用XSD創建了自定義配置節。爲了解析遵循這個新的模式配置文件,我加載資源(我.xsd文件)這一點:無法使用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); 
     } 

    } 

通過我的資源是這樣的:MonitoringConfiguration.xsd。另一個部分類(表示.xsd文件後面的代碼)的名稱空間爲MonitoringAPI.Configuration

的問題這裏位於:

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

的xsdStream是空的,所以我猜資源不能被發現!但爲什麼?

謝謝

回答

75

資源的名稱始終是:

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

所以,如果您的資源位於 「資源/ XSD /」,和你的默認項目命名爲「MonitoringAPI。配置」資源名稱是:

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

同時確保構建一個爲您的資源ction設置爲「嵌入的資源」

+0

我的資源與這個班級位於同一目錄。 – 2010-06-18 10:20:21

+1

右鍵單擊該文件並選擇「屬性」。 – 2010-06-18 10:22:00

+0

謝謝你是這個問題!我花了半天的時間找出問題,並在一分鐘內解決了問題;) – 2010-06-18 10:24:20

8

默認情況下,Visual Studio中沒有嵌入XSD文件,因此你必須確保「生成操作」 XSD文件的屬性設置爲「嵌入的資源」,使之工作

48

簡單而正確的方式來讓你的嵌入式資源的實際名稱:

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

然後,只需檢查resourceNames數組,你就知道肯定有什麼要傳遞給GetManifestResourceStream方法。

+2

到user1958681 ...是的!!!就我而言,資源路徑是「非標準」的,因爲他們的名字中沒有資源子目錄。陣列技巧是完美的知道正確的命名。非常感謝!! – 2013-03-06 19:00:50

+0

我的名字也沒有subdir。有誰知道爲什麼? – 2016-03-13 21:14:09

+1

我發現只需在調試時就在中間窗口中運行'Assembly.GetExecutingAssembly()。GetManifestResourceNames();'就足夠了。給出一個很好的格式化輸出,易於閱讀。 – Lankymart 2016-06-03 16:12:00

8

在我的情況下,

當您嘗試通過GetManifestResourceStream()訪問文件。由於文件路徑無效,您將收到錯誤,並且流將爲空。

解決方案:

右鍵單擊您在已添加到解決方案文件,然後單擊屬性。

選擇Build Action作爲Embedded Resource。 (而不是Content - 默認)

Build action property set to embedded resource

4

只需添加Form1.resx中下你的資源 - >添加現有項

你下的資源添加到folder.go性質的資源,雙擊和選擇「嵌入式資源」而不是無。

然後 嘗試調試的訂單:

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

檢查您添加的資源是在數組中。然後從這個數組中精確地複製資源名稱,然後嘗試將名稱放在代碼中。

1

你可以通過資源名稱是如下如下獲取資源流...

  1. 獲取資源的名稱,如。

    大會objAssembly = Assembly.GetExecutingAssembly ();

    string [] strResourceNames = objAssembly.GetManifestResourceNames();

  2. 傳遞資源名稱爲...

    流STRM = objAssembly.GetManifestResourceStream(strResourceNames);

現在你有流,你可以做任何你想做...

0

對我來說,這是完全不同的東西:

我UWP應用程序在調試編譯正確,發佈配置,但GetManifestResourceStream返回Null僅釋放配置。

問題是,在UWP構建配置文件中(並且僅在那裏),設置「編譯.NET本地工具鏈」已啓用。禁用後,GetManifestResourceStream按預期工作。

0

我有一個問題,我在許多不同的程序集中嵌入了整個.xsd文件堆;除了一個之外,一切正常(GetManifestResourceNames正在返回我期望看到的文件)。這是不被調用的一個:

​​

我針對的不是特定的文化中,在文件名末尾的.LA位正在由編譯器拾起,因爲這是文件的LA文化 - 清單中的文件名以Something.xsd的形式出現(在文化LA下) - 因此我無法找到它(它以衛星程序集結尾)。我通過重命名文件避開了這個問題 - 大概有可能明確說明給定嵌入式資源的文化。

事實上,一個快速谷歌顯示: How can I prevent embedded resource file culture being set based on its filename

根據這個答案,你必須做的事情哈克 - 所以也許重命名該文件並沒有那麼糟:)