Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Embedded Resource missing in Visual Studio 2010 when name ends with "No.xxx"

I've come across a strange behaviour in Visual Studio 2010.

When using embedded resources (files which are added to my C# project and for which the Build Action property is set to Embedded Resource), the files are included in the output assembly as binary data. Listing the resources is straightforward:

class Program
{
    static void Main(string[] args)
    {
        string[] names = typeof (Program).Assembly.GetManifestResourceNames ();

        foreach (var name in names)
        {
            System.Console.Out.WriteLine (name);
        }
    }
}

However, if the embedded resource file name ends with No.xxx (the extension is irrelevant), the file does not show up in the list. I cannot figure out any reason why Visual Studio 2010 would not include such a file. What did I miss?

Note: if I rename the embedded resource file in the solution explorer to something else, then everything works as expected.

like image 793
Pierre Arnaud Avatar asked Aug 11 '10 07:08

Pierre Arnaud


1 Answers

Dan from the Microsoft Connect team has finally provided a valid explanation for this behaviour:

Hello, thanks for the report, this is actually working normally. The reason is that any resx files whose names match the pattern .VALIDCULTURE.resx are assumed to be specific to that culture. (This is how it has worked since VS2002, for better or worse) In your case "no" is a valid culture (Norwegian, I guess) so the build process builds it into a satellite assembly. Here's what I got when I tried this. Note the "no" subfolder. If in your app you change your current culture to Norwegian, the resource load will load this set of resources.

So the problem has nothing to do with the word No itself, but rather with the fact that it is a valid, two-letter, culture name (in my case Norwegian). I checked, and indeed, there was a sub-folder in bin\Debug named No, containing a satellite assembly named Project.resources.dll in it.

Renaming the resource to end with .EN.xxx or .FR.xxx does, of course, exhibit the same behaviour.


As of MSBuild 16.9 you can include files like these by setting the WithCulture property to "false", as pointed out by @reduckted :-)

<EmbeddedResource Include="Resources.en.xml" WithCulture="false" />
like image 122
Pierre Arnaud Avatar answered Oct 02 '22 14:10

Pierre Arnaud