229

I have two ASP.NET Web projects (ProjectA and ProjectB). When class in ProjectA is instantiating a class of ProjectB which uses a resource file Blah.resx, I get this error:

An exception of type 'System.Resources.MissingManifestResourceException' occurred in mscorlib.dll but was not handled in user code.

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

Whats causing this?

There is an article on Microsoft's site about this http://support.microsoft.com/kb/318603 which suggests:

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

This is a solution for Windows Forms project, I'm not sure if that also applies to Web projects.

dev.e.loper
  • 35,446
  • 76
  • 161
  • 247

33 Answers33

282

I just hit this same exception in a WPF project. The issue occurred within an assembly that we recently moved to another namespace (ProblemAssembly.Support to ProblemAssembly.Controls). The exception was happening when trying to access resources from a second resource file that exists in the assembly.

Turns out the additional resource file did not properly move references from the old namespace name to the new namespace name.

In the designer.cs for the resource file, there is a static property to get the ResourceManager. Within that getter, the string was still referring the old namespace. Once correcting it to the new namespace, the problem was resolved:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

last line should have been:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);
CFinck
  • 3,171
  • 1
  • 16
  • 10
  • 1
    link: MSDN documentation for the [ResourceManager](http://msdn.microsoft.com/en-us/library/system.resources.resourcemanager.aspx) class. – Boinst Jul 26 '12 at 02:29
  • 4
    Thanks it helped me solve this issue. One can also delete the designer file, then open then save the resx file to regenerate the designer file correctly. – Serge Oct 28 '13 at 08:53
  • 1
    I had the same issue and this was the answer I was looking for. Sadly it doesn't appear at compile time :-( Thanks – 0xC0DED00D Jan 11 '14 at 21:16
  • 1
    One more thing to note: this temp string does not get updated if you set a custom namespace to use under resource file properties (that's where you also choose a custom tool) – mare Sep 07 '14 at 11:03
  • One last thing to note: Resharper will not update this namespace reference when using it's 'Adjust Namespaces' command on a resx file (at least as of 8.2.1000) – Robert Petz Oct 15 '14 at 18:01
  • I have the same problem but cant fix it :( http://stackoverflow.com/questions/29490866/global-resource-file-asp-net – Waqar Ahmed Apr 08 '15 at 04:32
  • 2
    thanks had this problem too but it was because I added a subfolder with the same name as the last part of the namespace of the project so it was looking for project.folder.folder.class instead of project.folder.class. I moved it to the root and now it lines up and works! – SelAromDotNet Aug 21 '15 at 22:37
  • In my case it was an icon which wasn't handled correctly, but this answer gave me enough clues to know what to look for and find the issue. I just removed the icon and added it back. Not sure how to actually fix it. – Owen Ivory Sep 19 '16 at 17:43
  • By change in namespace it works, Thank you – Milind Morey Dec 07 '22 at 09:05
127

I solved the problem like this:

  1. Right click on your ResourceFile and then "Properties"
  2. Change the "Build Action" property Compile to "Embedded Resource"
  3. Then build and run

It works perfectly.

Majid Basirati
  • 2,665
  • 3
  • 24
  • 46
Sibi Elango
  • 1,287
  • 1
  • 8
  • 2
  • @sibi Elango I right click on my ResourceFile but can't find the Build Action part. – S5498658 Jun 23 '15 at 17:22
  • 1
    @S5498658 If you don't see this in the context menu (right click), look in the Properties panel (usually located below the solution explorer). – defines Aug 07 '15 at 16:56
  • Its build action but still not working. Also I checked the directory and directory is the same under properties. – albatross Nov 24 '15 at 08:28
  • 6
    It would be great if the answer explains why this solution works. – Luis Teijon Jun 30 '17 at 18:30
  • For me I just did a rebuild and that fixed my issue. But I also r-clicked on my resource file --> Properties and verified "Build Action" to show "Embedded Resource". Worked fine. – John Waclawski Aug 14 '18 at 17:22
  • For me, the issue was my ResourceFile wasn't being included in the project (imported form). This works because the second half of this error message says "Make sure "Form1.resources" was correctly embedded or linked into assembly "ProjectA" at compile time, or that all the satellite assemblies required are loadable and fully signed." and these resource files weren't being embedded because their build action didn't say to embed them (or in my case, to include them). – Amanda Jan 28 '21 at 23:48
34

When I tried sharing a resource.resx file from one C# project with another C# project, I got this problem. The suggestion on moving the Form class to the beginning of its file wasn't appropriate. This is how I solved it. You essentially use a link from the second project to the first, then enable regeneration of the resource.designer.cs file.

  1. Delete the second project's Properties/Resources.resx file
  2. Add the first project's Properties/Resources.resx file as a LINK to the Properties folder in the second project. Don't add it to the root level of the project.
  3. Don't add the first project's Properties/Resources.designer.cs!
  4. On the properties of the second project's Resources.resx, add ResXFileCodeGenerator as the CustomTool
  5. Right click on the Resources.resx and select "Run Custom Tool". This will generate a new designer.cs file.

Note: I would avoid editing the resource.designer.cs file, as this is autogenerated.

Mark Lakata
  • 19,989
  • 5
  • 106
  • 123
  • 1
    This only works if you do not have a Resources.resx file already in the target/second project that you want to keep. – Joniale Mar 07 '23 at 13:24
18

In my case a series of badly thought global text replacements had inadvertently changed this line in the resource designer cs file.

enter image description here

Since the namespace in that argument did not match the namespace of the class anymore, the application got confused at run time.

Check that the namespace of the designer matches the string argument in that line.

cockypup
  • 1,013
  • 1
  • 10
  • 24
  • Same here: it happened after migrating from PCL to .NET Standard, when i created a temporary project and namespace, into which i copied all portable files, removed the portable project and reverted the namespace back to the original, this line still contained the temporary namespace from the migration process. – Zerga Oct 02 '18 at 08:09
  • 1
    my case: I create .resx file with Rider with '.' (dot) in name, generator autoreplace '.' to '_' in RecourceManager parameter. 'Could not find the resource' as a result – barsmaga May 27 '21 at 16:54
  • Had same issue using Rider – Korfu Jul 01 '22 at 09:58
16

For users who facing this isssue in .NET Core 3.0, this could be related to a breaking change that made in .NET Core 3.0, to resolve it just set EmbeddedResourceUseDependentUponConvention to false in your project csproj:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
Soheil Alizadeh
  • 2,936
  • 11
  • 29
  • 56
  • 4
    This was the solution for me, except my problem was with a Winforms project that I'd ported to an SDK-style project. In this case, I had to set `EmbeddedResourceUseDependentUponConvention` to **`true`** rather than `false`. – Matthew Watson Jun 11 '21 at 14:16
  • @MatthewWatson Thank you! That was the solution! – Shahin Dohan Mar 31 '22 at 17:01
  • This solved the problem for me when referencing a private NuGet package containing a project in the SDK style. It seems that the resources are named according to the filename instead of the class name when it is an SDK-style project where as in the old format only the class name and namespace gets used. – Jonas Marty Feb 15 '23 at 14:07
15

It happens because the *.resх is excluded from migration.

  • Right click on your ResourceFile
  • Click on the menu item "Include in project"
Matteo Baldi
  • 5,613
  • 10
  • 39
  • 51
user1919359
  • 161
  • 1
  • 4
  • 2
    This fixed it for me. Normally the resx file is added automatically. I did a merge where I had to change the project file and add the migrations manually, so maybe that had something to do with it – smarty Feb 20 '18 at 15:22
  • Worked for me. I have to add all *.resx files of each migration. Thanks – m.rufca Apr 08 '19 at 00:37
11

I found that deleting the designer.cs file, excluding the resx file from the project and then re-including it often fixed this kind of issue, following a namespace refactoring (as per CFinck's answer)

Stephen Drew
  • 1,415
  • 19
  • 31
11

No-one seems to have mentioned this solution. Obvious really - but tripped me over for a moment...

The default access modifier for a new resources file is Internal (or Friend in VB.Net.) Make sure you change this to Public

(in the resx designer there is a dropdown at the top for the access modifier)

James S
  • 3,558
  • 16
  • 25
7

I resolved this by going to the project where my resources file was saved, scrolling down to its ItemGroup and adding a logical name that corresponded to the path the compiler expected.

My EmbeddedResource looked like this:

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

Now it looks like this

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
Juansero29
  • 231
  • 2
  • 10
5

Sibi Elangos's answer alone was not sufficient for me, so I had to:

  • Right click on your ResourceFile
  • Change the "Build Action" property
  • Compile to "Embedded Resource"
  • Build and deploy

This will generate an App_GlobalResources in your /bin folder, now copy that folder also to the root of the web application

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
AlexanderD
  • 596
  • 2
  • 10
  • 22
5

In my case, the issue caused by the wrong order of class definitions. For example, I had added another class definition before my Form class:

namespace MyBuggyWorld
{
    public class BackendObject //This hack broke the VS 2017 winform designer and resources linker!
    {
        public TcpClient ActiveClient { get; set; }
        public BackgroundWorker ActiveWorker { get; set; }
    }

    public partial class FormMain : Form
    {
    }
}

After moving BackendObject to the end of the file (better yet would be to move it to a separate file), doing project clean + rebuild resolved the issue.

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
Jawad Al Shaikh
  • 2,475
  • 2
  • 28
  • 41
4

As far as this case is concerned check if the assembly containing resources has the default namespace set to the same text (Project->Properties->Default namespace; in VS) Check as well if the resx file has a property BuildAction set to "Embedded resource" Enjoy... ;)

Mohammad Fazeli
  • 648
  • 10
  • 13
  • 1
    Hi, do you mean that the default namespace (xxx) text should be the same as in the code: `Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);` – DanielV Apr 20 '15 at 15:46
3

One approach would be to put the shared classes/resources in a separate class library project and refer them in both the web sites.

Subbu
  • 254
  • 2
  • 3
3

Just another case. I copied a solution with two projects and renamed them partially in the Windows explorer (folder names, .sln and .csproj file names) and partially with a massive Find & Replace action in Visual Studio (namespaces etc.). Nevertheless the exception stated by the OP still occurred. I found out that the Assembly and Namespace names were still old.

Although the project and everything else was already named OfficeStyle the Assembly name and Default namespace were still named Linckus.

Old situation

After this correction everything worked fine again, compile and run time :)

New situation

Youp Bernoulli
  • 5,303
  • 5
  • 39
  • 59
3

Thanks @CFinck ! Just to add a tip to others : I changed the ResourceManager line with this :

New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

I'm in vb.net but I think in C# the only difference would be + instead of & to concatenate strings.

This way I can use the same linked assembly files in two similar projects that share the resources.

Spiky
  • 509
  • 4
  • 11
2

This error is also raised by Dotfuscation, since a resx designer file relies on reflection. If you are using Dotfuscator it will break your resx files. You must always add them as an exclusion from the obfuscation process.

Trevor Elliott
  • 11,292
  • 11
  • 63
  • 102
2

When we were using

HttpContext.GetGlobalResourceObject()

It would generate that error unless we wrapped that call inside a try/catch statement.

jmb_coder
  • 41
  • 2
2

For me the problem was copying .resx files and associated .cs files from one project to another. Both projects had the same namespace so that wasn't the problem.

Finally solved it when I noticed in Solution Explorer that in the original project the .resx files were dependent on the .cs files:

MyResource.cs
|_ MyResource.resx

While in the copied project the .cs files was dependent on the .resx files:

MyResource.resx
|_ MyResource.cs

It turned out that in the second project somehow the .resx files had been set to auto-generate the .cs files. The auto-generated .cs files were overwriting the .cs files copied from the original project.

To fix the problem edit the properties of each .resx file in the copied project. The Custom Tool property will be set to something like ResXFileCodeGenerator. Clear the Custom Tool property of the .resx file. You will need to re-copy the .cs file from the original project as it will have been overwritten by the auto-generated file.

Simon Elms
  • 17,832
  • 21
  • 87
  • 103
2

This can be caused by mismatched namespaces. The second from top answer (Sibi Elango's) says to right-click the resx file, and change Build option to EmbeddedResource, but I had already done that and still had the error. The top answer (CFinck's) notes a way of fixing this via manually editing files, however, I had this problem in MonoDevelop, and had to set the default namespace to the same as the cs file which was calling for the resource (the file which contained code such as the code below)...

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

After setting the default namespace via the GUI, the line above no longer caused an exception.

Poikilos
  • 1,050
  • 8
  • 11
1

I have a WinForms application with a single project in the solution.
Targeting .NET Framework 4.0
Using SharpDevelop 4.3 as my IDE

Sounds silly, but I happened to have the Logical Name property set to "Resources" on my "Resources.resx" file. Once I cleared that property, all works hunky-dory.

Normally, when you add random files as EmbeddedResource, you generally want to set the Logical Name to something reasonable, for some reason, I did the same on the Resources.resx file and that screwed it all up...

Hope this helps someone.

nurchi
  • 770
  • 11
  • 24
1

In my case these lines of code added to Web.config helped a lot:

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

Together with Build action: Embedded Resource and Custom Tool: PublicResXFileCodeGenerator.

m_david
  • 3,207
  • 1
  • 17
  • 16
1

Yet another cause: if your namespace has a hyphen ("-"), then it will build and run correctly, but the resource won't be accessible. Namespaces (identifiers) aren't supposed to have hyphens, but this doesn't appear to be enforced anywhere except in loading resources. This has burned me twice over the decade.

beanmf
  • 493
  • 5
  • 7
1

I faced this issue for running Migration command.Update-Database in Package Manager console.

Accepted answer didn't solve my problem.

I had to change Build Action from Compile to Embedded Resource and It worked for me.

You can do the same using below steps:

  1. Right click on migration.
  2. Change the "Build Action" property "Compile" to "Embedded Resource"
  3. Run Update-Database command.
TheKingPinMirza
  • 7,924
  • 6
  • 51
  • 81
1

In my case I was trying to migrate a Form from one project to another. It turns out I only forget to add Form.resx to the new project. In the form I was using some icons so it was dependent to resources.

F.zehra
  • 87
  • 8
1

For me it was the following. In the MyStrings.Designer.cs file:

global::System.Resources.ResourceManager temp = 
    new global::System.Resources.ResourceManager(
      "MyApplication.MyProject", typeof(MyStrings).Assembly);

I had assumed that MyApplication.MyProject referred to the Namespace of the class rather than the directory of the file. I had placed the files in a subdirectory called Resources but the namespace didn't reflect that.

I changed it to

global::System.Resources.ResourceManager temp = 
    new global::System.Resources.ResourceManager(
      "MyApplication.MyProject.Resources", typeof(MyStrings).Assembly);

And it worked! (I didn't even have to update the namespace!)

komodosp
  • 3,316
  • 2
  • 30
  • 59
0

I was also facing the same issue, tried all the solutions mentioned in the answer but none seemed to work. Turned out that during the checkin of code to TFS. TFS did not checkin the Resx file it only checked in the designer file. So all other developers were facing this issue while running on their machines. Checking in the resx file manually did the trick

Kayani
  • 942
  • 7
  • 23
0

Another thing to check is if you have LogicalName or ManifestResourceName defined on the EmbeddedResource. Make sure those are defined appropriately if your project file is using them as they can cause the resources to live under a name you are not expecting.

0

I had the same issue when trying to run an update-database command on EF. Turns out the migration that was throwing the exception had the .resx file excluded from the project. I just right-clicked the .resx file and clicked "Include In Project". Problem solved.

LuTheZy
  • 61
  • 8
0

In my case, Build Action of the resource file was already Embedded Resource but every time I ran update-database, I got the same error, so i did the fellow steps and it's worked:

  1. Change Build Action property to Compile
  2. Build (got so many errors)
  3. Change back Build Action property to Embedded Resource
  4. update-database

And for some reason it's worked.

kamal hamidi
  • 665
  • 1
  • 6
  • 16
0

Had a similar issue for a NetCore project and I noticed that after I added my migration (let's name it WhateverMigration), the .resx file reference as EmbeddedResource was not added to the .csproj even tho everything seemed fine. So I opened my .csproj file and I added:

<EmbeddedResource Update="Migrations\202107071914322_WhateverMigration.resx">
    <Generator></Generator>
    <DependentUpon>202107071914322_WhateverMigration.cs</DependentUpon>
</EmbeddedResource>
Mari Faleiros
  • 898
  • 9
  • 24
0

You can also run into this exception when migrating a Windows Forms csproj to the new SDK-style project format. If you have any forms or user controls in subfolders, the *.resx files will generate using a namespace that includes the subfolder, which may not match the *.Designer.cs namespace. The solution is to add the following to the csproj:

<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
Michael Csikos
  • 688
  • 9
  • 11
0

None of the other answers solved it for me. I had moved a number of forms and controls from one assembly to another, fixed all the namespaces and raN into this issue.

To keep the moved controls and forms separate from the rest I had put them in a subfolder. One resource reference was updated as suggested in one of the other answers. The IDE was warning me about the file path not matching the namespace with a blue squiggly but that is not an error so I initially ignored it.

When nothing appreared to fix it for me and I did not know anything better to try anymore I finally moved the controls and forms out of their subfolder (which was not expressed in the namespace) and the problem was gone.

Apperently there is still some hard dependency in WinForms on the folder structure.

Martin Maat
  • 714
  • 4
  • 23
-1

Just because you are referencing Project B's DLL doesn't mean that the Resource Manager of Project A is aware of Project B's App_GlobalResources directory.

Are you using web site projects or web application projects? In the latter, Visual Studio should allow you to link source code files (not sure about the former, I've never used them). This is a little-know but useful feature, which is described here. That way, you can link the Project B resource files into Project A.

Heinzi
  • 167,459
  • 57
  • 363
  • 519