2012-05-23 24 views
35

我有一個web應用程序項目。我生成了DLL並將其導入到另一個項目中。我實施了VirtualPathProvider爲什麼GetManifestResourceStream在調用GetManifestResourceNames時資源名稱存在時返回null?

我跟着這個網站:http://support.microsoft.com/kb/910441/en-us?spid=8940&sid=global,一切工作,直到我添加另一個網站的主人。

  1. 我加了site_export.master,並將其生成操作更改爲嵌入式資源。
  2. 我改變了我的頁面以使用新的站點主站。
  3. GetManifestResourceStream()返回null當我加載site_export.master
  4. 我打電話給GetManifestResourceNames()來檢查DLL中是否存在site_export.master,它確實存在。它在列表中。所有的名字空間都匹配。我沒有在這裏列出名字空間。

爲什麼不能GetManifestResourceStream()加載我的新site_export.master?它加載site.master就好了。我知道我的DLL被加載,因爲我可以看到DLL中的其他文件。

+2

可能重複的HTTP ://stackoverflow.com/questions/3068736/cant-load-a-manifest-resource-with-getmanifestresourcestream) – nawfal

回答

70

,請記住以下事項......

步驟1。構建操作設置爲嵌入的資源看

C#’s GetManifestResourceStream Gotcha

步驟2。使用namespace.resourcename看到GetManifestResourceStream() returns null ?

其實,如果在其他程序集的私有資源被訪問和調用方不具有ReflectionPermissionReflectionPermissionFlag.MemberAccess標誌此方法返回null。

+2

非常有用,謝謝!第2步爲我解決了它。 – Dan

+4

哈哈...嵌入式資源......非常感謝,節省了很多時間:) –

+0

它的確切答案 –

48

側面提示。爲了確保你在正確的裝配和右名稱:轉儲和評估所有可用的資源,你的目標組裝

string[] names = assembly.GetManifestResourceNames(); 

(在我的情況,我濫用從其他程序集的命名空間)

+3

這幫我找到了我的問題;謝謝:) – Cephron

+0

在簡單的情況下粘貼到「立即窗口」,而調試時:'Assembly.GetExecutingAssembly()。GetManifestResourceNames();' –

+0

@JuhaPalomäki,它可能會幫助,但不是在所有情況下(所以你會收到像「評估需要所有線程運行「),特別是在VS2017中。 –

0

試試這個:

Dim ctx As Windows.ApplicationModel.Resources.Core.ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext() 
ctx.Languages = {Globalization.CultureInfo.CurrentUICulture.Name} 
Dim rmap As Windows.ApplicationModel.Resources.Core.ResourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap 
Dim res = rmap.GetValue("Assets/sample.png", ctx) 
Dim resFile = Await res.GetValueAsFileAsync 

Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap列出所有資源。

1

提示和小心: 如果「程序集名稱」和「默認命名空間」在項目文件中不匹配,那麼GetManifestResourceStream也會返回null。 GetManifestResourceNames仍然返回程序集的名稱,但在加載時清單不起作用。

5

我這樣做是爲了使其工作:

第1步:選擇資源(在我的情況CRDF.xsl)並點擊右鍵 - >屬性。 將生成操作設置爲「EmbeddedResource」並將邏輯名稱設置爲您選擇的名稱,例如CRDFXSL。

第2步:更改源代碼是這樣的:

Assembly _assembly; 
    _assembly = Assembly.GetExecutingAssembly();   
    xslStream = _assembly.GetManifestResourceStream("CRDFXSL"); 
    _xmlReader = XmlReader.Create(xslStream); 

因此一切都smoooooooth ..

的[無法加載與GetManifestResourceStream()清單資源(
+0

要添加的一件事 - 您可能需要在手動設置* .csproj文件中設置''(https://social.msdn.microsoft.com/Forums/vstudio/en-US/c94da8fd-0b0f-45c0-b137 -25ab5ccc7e53 /創建項目 - 項目 - 與最logicalnamelogicalname屬性合的項目文件?論壇= VSX)。 –

相關問題