2011-03-16 80 views
1

我有一個XML文件,作爲我希望在運行時訪問的Silverlight 4.0項目的一部分。我將該文件保存在一個名爲Resources的目錄中,並將Build Action設置爲「Content」,將Copy to Output Directory設置爲「Do not copy」。如果我解壓縮XAP文件,我會在我期望的位置看到XML文件,但我不確定如何從代碼中引用它。目前,我有以下幾點:在運行時訪問資源

Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"/AssemblyName;component/Resources/MyFile.xml")

不幸的是,流運行上面的代碼後空。除了上面提到的路徑之外,我嘗試了「/Resources/MyFile.xml」,「/MyFile.xml」和「MyFile.xml」,但它們都經歷了相同的行爲。

在Silverlight應用程序中訪問作爲資源嵌入的XML文件的正確方法是什麼?

回答

2

與構建行動「內容」只是被嵌入到XAP文件,具有相同的相對目錄結構的資源作爲應用程序。它不會作爲資源嵌入到程序集中。

當設置爲打造行動「內容」,你應該能夠只加載使用類似文件(或任何適合您的需要):

XElement.Load(<relative directory>/<file>)

你使用目前的方法(使用資源流)用於嵌入式資源(其構建操作設置爲「資源」)。而對於那些,雖然我還沒試過,如果你的方法工作,通常你會使用

Application.GetResourceStream 
+0

我實際上嘗試將構建操作設置爲「資源」,但發生了同樣的事情(執行後流爲空)。 XElement.Load()引發以下異常:在應用程序xap包中找不到文件'/Resources/MyFile.xml'。 – senfo 2011-03-16 20:40:26

+1

@senfo:刪除第一個正斜槓(即:「Resources/MyFile.xml」),它應該可以工作(假設「MyFile.xml」位於Silverlight項目的名爲「Resources」的子目錄中)。 – 2011-03-16 20:55:09

+0

就是這樣!非常感謝你! – senfo 2011-03-16 21:10:54

1

我已經使用下面的代碼片段來獲取drawables。不知道這是完全相關的,但希望這會給你一個提示拉上......

Resources res = getResources(); 
spec = tabHost.newTabSpec("groups").setIndicator("Groups", res.getDrawable(R.drawable.ic_tab_groups)).setContent(intent); 
1

由於獲得的資源是由威廉·Rumpt提到,「內容」的資源是不常見的資源(他們AREN沒有存儲在程序集中)。我已經檢出this article,並且找不到所有可以引用資源的標記爲其他程序集的「內容」。

所以,你有兩個選擇:

  1. 定義XML作爲嵌入資源
  2. 定義XML作爲資源

在第一種情況下的流請求如下所示:

 var a = Assembly.Load("AssemblyName"); 
     var s = a.GetManifestResourceStream(@"DefaultNamespace.Resources.XMLFile2.xml"); 

在第二種情況下:

 var a = Assembly.Load("AssemblyName"); 
     var rm = new ResourceManager("AssemblyName.g", a); 
     using (var set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true)) 
     { 
      var ums = (UnmanagedMemoryStream)set.GetObject(@"Resources/XMLFile1.xml", true); 
     } 

希望這會有所幫助。