MsBugKiller
MsBugKiller

Reputation: 833

Why does GetManifestResourceStream returns null while the resource name exists when calling GetManifestResourceNames?

I have a web application project. I generated the DLL and import it in another project. I implemented VirtualPathProvider.

I followed this web site: http://support.microsoft.com/kb/910441/en-us?spid=8940&sid=global, and everything works until I add another site master.

  1. I added site_export.master and changed its Build Action to Embedded Resource.
  2. I changed my page to use the new site master.
  3. GetManifestResourceStream() returns null when I load site_export.master.
  4. I call GetManifestResourceNames() to check if site_export.master exists in the DLL and it does. It's in the list. All of the name spaces match. I didn't list the name space out here.

Why can't GetManifestResourceStream() load my new site_export.master? It loads site.master just fine. I know my DLL is loaded because I can see other files in the DLL.

Upvotes: 62

Views: 105722

Answers (5)

Deepak Chaudhary
Deepak Chaudhary

Reputation: 145

I did this to make it work:

Step 1: Select the resource (CRDF.xsl in my case) and right click > Properties. Set Build Action to "EmbeddedResource" and Logical Name to name of your choice, e.g. CRDFXSL.

Step 2 : Change your Source code like this:

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

Thus everything went smoooooooth..

Upvotes: 14

ShuttlePod
ShuttlePod

Reputation: 56

Hint and Caution: If the "Assembly name" and "Default namespace" does not match in the project file then also GetManifestResourceStream would return null. GetManifestResourceNames still returns the names of assemblies but during loading the manifest would not work.

Upvotes: 4

Shahdat
Shahdat

Reputation: 5483

Remember the following issues...

Step 1. Build action set to embedded resource see

C#’s GetManifestResourceStream Gotcha

Step 2. Use namespace.resourcename see GetManifestResourceStream() returns null ?

Actually, this method returns null if a private resource in another assembly is accessed and the caller does not have ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag.

Upvotes: 110

Rtisatto
Rtisatto

Reputation: 795

Try this:

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

The Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap list all resources.

Upvotes: 0

Yury Schkatula
Yury Schkatula

Reputation: 5369

Side-hint. To make sure you're in the right assembly and with right name: dump and evaluate all the resources available in your target assembly

string[] names = assembly.GetManifestResourceNames();

(in my case, I misused a namespace from another assembly)

Upvotes: 97

Related Questions