172

The situation:

  • I have a class library, called RT.Servers, containing a few resources (of type byte[], but I don't think that's important)
  • The same class library contains a method which returns one of those resources
  • I have a simple program (with a reference to that library) that only calls that single method

I get a MissingManifestResourceException with the following message:

Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Servers.Resources.resources" was correctly embedded or linked into assembly "RT.Servers" at compile time, or that all the satellite assemblies required are loadable and fully signed.

I have never played around with cultures, or with assembly signing, so I don't know what's going on here. Also, this works in another project which uses the same library. Any ideas?

nvoigt
  • 75,013
  • 26
  • 93
  • 142
Timwi
  • 65,159
  • 33
  • 165
  • 230
  • 3
    This is one of the most unhelpful exceptions in .NET. It triggers in at least 3 scenarios that share nothing in common. – rr- Sep 08 '15 at 09:35
  • 3
    Sorry, but it is a Microsoft way: **remove all, and then add again**. Works for resources, NUGET, references and connection strings. There are a lot of tools, but you will spent time for the raw files in non-usual cases... – maxkoryukov Jun 29 '16 at 22:22

27 Answers27

273

All I needed to do to fix this problem was to right-click the Resources.resx file in the Solution Explorer and click Run Custom Tool. This re-generates the auto-generated Resources.Designer.cs file.

If the .resx file was added to the project manually, the Custom Tool property of the file must be set to "ResXFileCodeGenerator".

The problem is due to a mismatch of namespaces, which occurs if you change the "default namespace" of the assembly in the project settings. (I changed it from (previously) "Servers" to (now) "RT.Servers".)

In the auto-generated code in Resources.Designer.cs, there is the following code:

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

The literal string "Servers.Resources" had to be changed to "RT.Servers.Resources". I did this manually, but running the custom tool would have equally well done it.

Timwi
  • 65,159
  • 33
  • 165
  • 230
  • 1
    +1! In VS 2010 the ResourceManager literal string shown above is automatically updated to the value of the Default Namespace in the project properties (Application tab), at least for WinForms. – TrueWill Oct 12 '10 at 21:17
  • 4
    What if you don't have a resources.resx file? – ashes999 Sep 29 '11 at 20:54
  • @ashes999: Have you looked in the Properties folder? That's where it usually is for C# projects at least. – RenniePet Aug 07 '12 at 21:41
  • i have ran same issue.The .resx file was added to the project manually, the Custom Tool property of the file I set to "ResXFileCodeGenerator".then resx file is first and later designer.vb file later.Actully desinger file is first and later .resx file. how can i make it .... – Kavitha Dec 18 '12 at 05:57
  • 1
    I'm running Visual Studio 2013 and there isn't a "Run Custom Tool" when I right click. Any suggestions on where this guy might be hiding? – Abe Miessler May 21 '14 at 01:42
  • Thank you! I also had to delete Resources.Designer.vb and then run the custom tool! Thanks Again! – user1683987 Nov 07 '14 at 21:14
  • 2
    @AbeMiessler well yeah.. you go to properties and there in you';ll see CustomTool paste the "ResXFileCodeGenerator" and right click the file in solution explorer and run custom tool. I am sure you have already figured it out,but for future reference to anyone in need :) – wingskush Jun 17 '15 at 09:46
42

I just came across this problem today, and I found this Microsoft Help and Support page that actually did work around the problem.

I had a couple delegates at the top of my file, in the global namespace, and all of a sudden I was getting a MissingManifestResourceException when running the program, on this line:

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

Then I moved the delegates into the namespace, got the same error. Finally I put the delegates in the only class in that file, and the error went away, but I didn't want the delegates in that class or namespace.

Then I came across that link above, which said

To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.

I put the delegates (which I would not consider "class definitions") at the bottom of that file, outside of the local namespace, and the program didn't get the MissingManifestResourceException anymore. What an irritating error. But, that seems like a more robust solution than modifying the auto-generated code :)

Mark Rushakoff
  • 249,864
  • 45
  • 407
  • 398
  • Thanks for your answer. This sounds like you had a different problem which caused the same symptom. I didn't have any extra classes in my code, indeed I didn't even have any forms at all. I should edit my previous answer because I discovered I didn't actually need to modify the auto-generated code. I could have just re-run the code generator, and it would have fixed itself. No idea why the build process didn't do it automatically. – Timwi Sep 05 '09 at 14:02
  • 7
    I got the error due to adding a class above the Form's class in the Form1.cs file (as discussed in the "Resolution" section of the link you provided). Thanks! – Matt Smith Jul 25 '12 at 16:56
  • Same problem; nothing else was working so I merely deleted the line: this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 'cause I don't care about the icon in that particular form :) – Gary Huckabone Jan 04 '18 at 20:30
  • That's the answer. Thank you. – Sertan Pekel May 03 '18 at 11:34
  • If anyones confused I had a class called "StringExtensions" before "Form1" bit of the Form1.cs, i moved it below Form1 in form1.cs instead of above and it worked – Ma Dude Oct 21 '18 at 02:23
39

I've run into a similar issue and, although I know it isn't the cause the OP had, I'll post it here so that if someone else runs across this problem in the future, an answer will be available.

If you add a class before the designer class you will get a MissingManifestResourceException exception at runtime (no compile time error or warning) because

Visual Studio requires that designers use the first class in the file.

For (slightly) more information see this post.

Motti
  • 110,860
  • 49
  • 189
  • 262
  • 15
    Thanks for posting this "answer". Despite it being "off topic" relative to the OP's problem, it was a good idea to post it here. A search for MissingManifestResourceException led me to this thread, and your answer was spot-on for my problem. – RenniePet Mar 18 '11 at 13:07
19

I had the same problem, but using the Run Custom Tool command as suggested by Timwi did not help in my case.

However it lead me into the right direction, because I ended up in the Properties of the .resx file. Here I noticed a difference to another .resx file that caused no problems.

In my case I had to change the property "Build Action" from "Resource" to "Embedded Resource".

My best guess for the reason is, that I had the .resx in a library that was used from another application. My application did not have its own .resx file, so it had to use the one from the library - which is only available when it's embedded in the library and not "stand alone".

Community
  • 1
  • 1
BlaM
  • 28,465
  • 32
  • 91
  • 105
  • 3
    +1 thanks, I double-checked my resource files which are also in a separate library that is referenced by other applications. I had Build Action set to Content, and after changing it to Embedded Resource, all worked well. Silly oversight – Shan Plourde May 01 '11 at 02:31
  • 2
    Thanks! This worked for me where I had some text files containing content for either testing, or some business mapping rules. Changing from Content to Embedded Resource fixed the problem. – S. Baggy Dec 04 '13 at 12:36
18

When I run in a similar issue, in Vs 2012, it turned out that the "Custom Tool Namespace" property of the resx file was wrong (in my case, actually, it was unset, so the generated code yeld this exception at runtime). My final set of properties for the resx file was something like this:

  • Build action: Embedded Resource
  • Copy to Output Directory: Do not copy
  • Custom Tool: ResXFileCodeGenerator
  • Custom Tool Namespace: My.Project.S.Proper.Namespace
Starnuto di topo
  • 3,215
  • 5
  • 32
  • 66
5

Also see: MissingManifestResourceException when running tests after building with MSBuild (.mresource has path in manifest)

I repeat the answer here just for completeness:

It appears adding LogicalName to the project file fixes it:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

i.e. so the embedded resource entry in the project file looks like this:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

This is detailed in: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Note that we are using a .resx file, but the bug still appears to occur.

Update: The problem with resources (incl. XAML) appears to be related to output paths and the use of forward or backward slashes as detailed in: Why does modifying project output directories cause: IOException was unhandled "Cannot locate resource 'app.xaml'."

Community
  • 1
  • 1
nietras
  • 3,949
  • 1
  • 34
  • 38
  • After about eight hours debugging this issue, and literally trawling through every github, SO and Google answer, this is the answer that solved my problem... fwiw, my issue began happening after migrating from .Net 3.5 to 4.7.2. – Neville Jul 08 '19 at 13:24
5

I ran into a different cause of this problem, which was unrelated to resx files. I had a class library where AssemblyInfo.cs contained the following:

[assembly: ThemeInfo(
ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]

The assembly did not contain any WPF code, theme or Resource dictionaries. I got rid of the exception by removing the ThemeInfo attribute.

I did not get an actual exception, only

A first chance exception of type 'System.Resources.MissingManifestResourceException'.

Viewing exception details, the system was requesting MyAssembly.g.resources

Hope this might be of help to someone else.

bigfoot
  • 455
  • 5
  • 12
3

Not sure it will help people but this one worked for me :

So the issue I had was that I was getting the following message:

Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "My.Resources.Resources.resources" was correctly embedded or linked into assembly "X" at compile time, or that all the satellite assemblies required are loadable and fully signed"

I was trying to get the resources that were embedded in my project from another class library.

What I did to fix the problem was to set the Access Modifier in the tab Project->Properties->Resources from "Internal" (accessible only within the same class library) to "Public" (accessible from another class library)

Then run and voilà, no more error for me...

Timwi
  • 65,159
  • 33
  • 165
  • 230
2

The solution given by BlaM worked for me too.

I am a VS 2013 User. After going through many fixes but no luck, I tried this:

  1. Right-click the resource file, one-by-one, in case of multiple-files.
  2. Make sure, the property "Build Action" is set to "Embedded Resource".

That's it! :)

1JD
  • 345
  • 3
  • 5
  • Confirming this. I have a working project but needed to maintain the resource assemblies separatly, so tried flipping from "Embedded Resource" to simply "Resource" and ended up getting the MissingResourceManifestException. – Mosca Pt Sep 23 '16 at 05:41
2

I had the same issue, but in my case i places a class in a usercontrol which is related to the usercontrol like this

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

The solution was to move the MyUserControlObject to the end of the Usercontrol class, like this

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

I hope this helps

Smith
  • 5,765
  • 17
  • 102
  • 161
  • Talk about a crappy error description... I added a helper class to the main form's CS file. Never would I have guessed the error message would link back to this. Thanks! – Adam Lewis Jun 01 '18 at 14:04
1

Recently ran into the same problem, struggled for a bit, found this topic but no answers were correct for me.

My issue was that when I removed main window from my WPF project (it does not have a main window), I forgot to remove StartupUri from App.xaml. I guess this exception can happen if you have a mistake in StartupUri, so in case if anybody is struggling with this - check your StartupUri in App.xaml.

Archeg
  • 8,364
  • 7
  • 43
  • 90
1

Recently stumbled upon this issue, in my case I did a few things:

  1. Make sure the namespaces are consistent in the Designer.cs file of the resx file

  2. Make sure the default namespace of the Assembly(right click the project and choose Properties) is set the same to the namespace the resources file is in.

Once I did step 2, the exception went away.

Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135
stormtrooper
  • 340
  • 2
  • 18
1

I was getting the MissingManifestResourceException error after I ported my project from VS2005 to VS2010. I didn't have any other classes defined in the file that contains my Form class. And I also had my resx Resource File Name set correctly. Didn't work.

So I deleted the resx files and regenerated them. All good now.

Winston
  • 11
  • 1
1

I had this problem when I added another class in the file just before the class which derived from Form. Adding it after fixed the problem.

franckspike
  • 2,039
  • 25
  • 18
1

Also the same error may occur when you put a new class into the source code of a designer created form's class.

This new class may be removed, and placed in a different cs file.

(At least in my case this was the problem...)

RobC
  • 22,977
  • 20
  • 73
  • 80
0

Because I am pre-compiling my web application (using VS2012 publish feature). I was getting the error above. I tried all the suggestions, but weirdly changing 'Build Action' to 'Content' did the trick!

Markive
  • 2,350
  • 2
  • 23
  • 26
0

In my case, I have a web api with resources and I create a nuget package from that. When I use this nuget in other projects, I realise that when I request a api with resources, I am getting MissingManifestResourceException after a bit reasearch, I learn nuget packager is not packing resources automatically. If you want to use resources files, you have to do that manually. So you need to add below lines to your .nuspec file: (Visit https://github.com/NuGet/Home/issues/1482)

<package> 
    <metadata>
    </metadata>
    <files>
        <file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
        <file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
    </files>
</package>

But, before adding files, you need to be sure which version of .net you are using.

dcy
  • 35
  • 7
0

I had the with a newly created F# project. The solution was to uncheck "Use standard resource names" in the project properties -> Application -> Resources / Specify how application resources will be managed. If you do not see the checkbox then update your Visual Studio! I have 15.6.7 installed. In 15.3.2 this checkbox is not there.

KCT
  • 287
  • 1
  • 10
0

Just to mention. If you use a constant or literal, make sure it refers to a resource of the form ProjectName.Resources, and does not cpntain Resources.resx.

It could save you an hour or two .

0

I've encountered this issue with managed C++ project based on WinForms after renaming global namespace (not manually, but with Rename tool of VS2017).

The solution is simple, but isn't mentioned elsewhere.

You have to change RootNamespace entry in vcxproj-file to match the C++ namespace.

AntonK
  • 1,210
  • 1
  • 16
  • 22
0

In my case it was a typo in the Xaml of a window opened from Winforms Form:

Incorrect: <Image Source="/Resources/WorkGreen.gif"/>

Correct: <Image Source="../Resources/WorkGreen.gif"/> It may help someone

tretom
  • 559
  • 1
  • 7
  • 17
0

In my case I have changed my project namespace and hence my solution was throwing "missingmanifestresourceexception" exception.

Instead of right clicking the .resx file in the solution explorer and clicking on "Run Custom Tool" option, I have replaced the rootnamespace to new namespace in .csproj file(RootNamespace) and rebuilded the solution again.

All Resources.Designer.cs files namespaces got automatically changed with new namespace.

I hope my answer will help someone.

0

If you're getting this while generating a C# project using CMake, the solution I found may help you.

Your CMakeLists.txt file needs

set_property(TARGET yourTargetName PROPERTY VS_GLOBAL_RootNamespace yourRootNamespace)

Substitute your own values for yourTargetName and yourRootNamespace, obviously.

Then the resources will get embedded in your assembly!

ulatekh
  • 1,311
  • 1
  • 14
  • 19
0

One more reason to get this error is- '.resx' file excluded from project.

In my case, '.resx' file was excluded from project.

  1. Select 'show all files' option in solution explorer.
  2. Right click on '.resx' file(s) and click include in project.

Rebuild the project/solution.

Himanshu Mange
  • 104
  • 1
  • 10
0

I read all the answers and nothing worked for me. Most likely my situation is different, but same error. My issue was that I had two projects. Second project had a lot of forms added to it from the first one as "Add as link".

For WinForms, there are 3 required files: the code, the designer, and the resource files. If you add all 3 files at the same time as "Add as link", Visual Studio does not link them together as same form. It will compile, and run, but it will blow up with the same MissingManifestResourceException error.

Fix: You have to do them individually, in order: code file --> designer file --> resource file. Then they are grouped and no more error, at least for me.

Lenard Bartha
  • 348
  • 1
  • 9
0

We came across this after upgrading a solution from .NET 4.8 to 6 and then back down to 4.8. A custom user control in our VB.net project had the filename of LinearVoltMeter.vb (.designer.vb, and .resx), but was in the namespace of Our.Namespace.LinearVoltGauge. We traced the error to this line:

Me.PictureBox1.Image = CType(resources.GetObject("PictureBox1.Image"), System.Drawing.Image)

Renaming the file (and hence control) to match the namespace, LinearVoltGauge, fixed the issue.

A. Niese
  • 399
  • 3
  • 13
-3

From the Microsoft support page:

This problem occurs if you use a localized resource that exists in a satellite assembly that you created by using a .resources file that has an inappropriate file name. This problem typically occurs if you manually create a satellite assembly.

To work around this problem, specify the file name of the .resources file when you run Resgen.exe. While you specify the file name of the .resources file, make sure that the file name starts with the namespace name of your application. For example, run the following command at the Microsoft Visual Studio .NET command prompt to create a .resources file that has the namespace name of your application at the beginning of the file name:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
Ry-
  • 218,210
  • 55
  • 464
  • 476
TheVillageIdiot
  • 40,053
  • 20
  • 133
  • 188
  • 1
    Thanks for your response, but I don't know what ResGen.exe is, I've never used it, and frankly I don't want to use it because I'm not trying to use anything fancy. Surely there must be a way to fix this from Visual Studio? For example, since you say the resource is "localized", how do I declare a resource as non-localized? Thanks again. – Timwi Aug 25 '09 at 16:15