簡體   English   中英

無法使用GetManifestResourceStream()加載清單資源

[英]Can't load a manifest resource with GetManifestResourceStream()

我已經使用XSD創建了自定義配置部分。 為了解析這個新模式之后的配置文件,我加載了資源(我的.xsd文件):

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為null,所以我猜想無法找到資源! 但為什么?

謝謝

資源的名稱始終為:

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

因此,如果您的資源位於“Resources / Xsd /”中,並且您的默認項目命名空間是“MonitoringAPI.Configuration”,則資源名稱為:

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

還要確保資源的構建操作設置為“嵌入式資源”

獲取嵌入資源的實際名稱的簡便方法:

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

然后只需檢查resourceNames數組,您就會知道要傳遞給GetManifestResourceStream方法的內容。

就我而言,

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

解:

右鍵單擊已添加到解決方案中的文件,然后單擊“屬性”。

選擇Build Action as Embedded Resource (而不是Content - 默認情況下)

構建動作屬性設置為嵌入式資源

默認情況下,visual studio不會嵌入xsd文件,因此必須確保將xsd文件的“Build Action”屬性設置為“Embedded Resource”才能使其正常工作

只需在form1.resx下添加資源 - >添加現有項目

雙擊您在Resources folder.go下添加到資源的資源,然后選擇“Embedded Resources”而不是“none”。

然后嘗試調試該行:

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

檢查您添加的資源是否在數組中。 然后從這個數組中精確復制資源名稱,並嘗試將名稱放在您的代碼上..工作正常!

您可以通過傳遞資源名稱來獲取資源流,如下所示......

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

    程序集objAssembly = Assembly.GetExecutingAssembly();

    string [] strResourceNames = objAssembly.GetManifestResourceNames();

  2. 將資源名稱傳遞給...

    Stream strm = objAssembly.GetManifestResourceStream(strResourceNames);

現在你有Stream你可以隨心所欲......

就我而言,它完全不同:

我的UWP App在Debug和Release配置中正確編譯,但GetManifestResourceStream僅返回Null Release配置。

問題是,在UWP構建配置文件中(並且僅在那里)啟用了“使用.NET Native工具鏈編譯 ”設置。 禁用后,GetManifestResourceStream按預期工作。

我有一個問題,我在許多不同的程序集中嵌入了一大堆.xsd文件; 一切正常(GetManifestResourceNames正在返回我希望看到的文件),除了一個。 那個沒被稱為的人:

Something.LA.xsd

我沒有處理特定的文化,文件名末尾的.LA位被編譯器拾取,因為這個文件是針對LA文化的 - 清單中的文件名是以Something.xsd(在文化下)洛杉磯) - 因此我無法找到它(它最終在衛星裝配中)。 我通過重命名文件來避免這個問題 - 大概可以明確說明給定嵌入式資源的文化。

實際上,一個快速谷歌揭示: 如何防止基於其文件名設置嵌入式資源文件文化

根據這個答案,你必須做hacky事情 - 所以也許重命名文件畢竟不是那么糟糕:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM