我有两个 ASP.NET Web 项目(ProjectA 和 ProjectB)。当 ProjectA 中的类实例化使用资源文件 Blah.resx 的 ProjectB 类时,我收到此错误:
mscorlib.dll 中出现“System.Resources.MissingManifestResourceException”类型的异常,但未在用户代码中处理。找不到适合指定区域性或中性区域性的任何资源。确保“Resources.Blah.resources”在编译时已正确嵌入或链接到程序集“App_GlobalResources.sn_flri6”中,或者所需的所有附属程序集都是可加载的并已完全签名。
这是什么原因造成的?
Microsoft 网站上有一篇关于此 http://support.microsoft.com/kb/318603 的文章,其中建议:
要解决此问题,请移动所有其他类定义,使它们出现在表单的类定义之后。
这是 Windows 窗体项目的解决方案,我不确定这是否也适用于 Web 项目。
我刚刚在 WPF 项目中遇到了同样的异常。该问题发生在我们最近移动到另一个命名空间(ProblemAssembly.Support
到 ProblemAssembly.Controls
)的程序集中。尝试从程序集中存在的第二个资源文件访问资源时发生异常。
结果发现附加资源文件没有正确地将引用从旧命名空间名称移动到新命名空间名称。
在资源文件的designer.cs中,有一个静态属性可以获取ResourceManager。在那个 getter 中,字符串仍然引用旧的命名空间。将其更正为新的命名空间后,问题就解决了:
global::System.Resources.ResourceManager temp =
new global::System.Resources.ResourceManager(
"ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);
本来应该:
global::System.Resources.ResourceManager temp =
new global::System.Resources.ResourceManager(
"ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);
希望这可以帮助下一个人。
我解决了这样的问题:
右键单击您的 ResourceFile 将“构建操作”属性更改为“嵌入式资源”然后构建并运行
它完美地工作。
当我尝试与另一个 C# 项目共享一个 C# 项目中的 resource.resx 文件时,我遇到了这个问题。将 Form 类移动到其文件开头的建议是不合适的。这就是我解决它的方法。您实际上是使用从第二个项目到第一个项目的链接,然后启用 resource.designer.cs
文件的重新生成。
删除第二个项目的 Properties/Resources.resx 文件 将第一个项目的 Properties/Resources.resx 文件作为链接添加到第二个项目的 Properties 文件夹中。不要将其添加到项目的根级别。不要添加第一个项目的 Properties/Resources.designer.cs!在第二个项目的 Resources.resx 的属性中,将 ResXFileCodeGenerator 添加为 CustomTool 右键单击 Resources.resx 并选择“运行自定义工具”。这将生成一个新的 Designer.cs 文件。
注意:我会避免编辑 resource.designer.cs 文件,因为它是自动生成的。
在我的例子中,一系列错误的全局文本替换无意中更改了资源设计器 cs 文件中的这一行。
https://i.stack.imgur.com/B4ikl.png
由于该参数中的命名空间不再与类的命名空间匹配,因此应用程序在运行时会感到困惑。
检查设计器的命名空间是否与该行中的字符串参数匹配。
这是因为 *.resх
被排除在迁移之外。
右键单击您的资源文件
单击菜单项“包含在项目中”
我发现删除designer.cs文件,从项目中排除resx文件,然后重新包含它通常会在命名空间重构之后解决此类问题(根据CFinck的回答)
似乎没有人提到这个解决方案。真的很明显 - 但让我绊倒了一会儿......
新资源文件的默认访问修饰符是 Internal
(或 VB.Net 中的 Friend
。)确保将其更改为 Public
(在 resx 设计器的顶部有一个访问修饰符的下拉菜单)
对于在 .NET Core 3.0 中遇到此问题的用户,这可能与在 .NET Core 3.0 中制作的 breaking change 有关,要解决此问题,只需在项目 csproj 中将 EmbeddedResourceUseDependentUponConvention
设置为 false:
<PropertyGroup>
<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
EmbeddedResourceUseDependentUponConvention
设置为 true
而不是 false
。
我通过转到保存我的资源文件的项目来解决这个问题,向下滚动到它的 ItemGroup 并添加一个与编译器预期的路径相对应的逻辑名称。
我的 EmbeddedResource 看起来像这样:
<ItemGroup>
<EmbeddedResource Update="Properties\TextResources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>TextResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
现在看起来像这样
<ItemGroup>
<EmbeddedResource Update="Properties\TextResources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>TextResources.Designer.cs</LastGenOutput>
<LogicalName>MyProject.Properties.Resources.resources</LogicalName>
</EmbeddedResource>
</ItemGroup>
单独的 Sibi Elangos's answer 对我来说是不够的,所以我必须:
右键单击您的资源文件
更改“构建操作”属性
编译为“嵌入式资源”
构建和部署
这将在您的 /bin
文件夹中生成一个 App_GlobalResources,现在将该文件夹复制到网络应用程序的根目录
就我而言,问题是由错误的类定义顺序引起的。例如,我在 Form 类之前添加了另一个类定义:
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
{
}
}
将 BackendObject
移至文件末尾(最好将其移至单独的文件)后,执行项目清理 + 重建解决了该问题。
就这种情况而言,检查包含资源的程序集是否将默认命名空间设置为相同的文本(项目->属性->默认命名空间;在 VS 中)检查 resx 文件的属性 BuildAction 是否设置为“嵌入式资源“享受... ;)
Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
一种方法是将共享类/资源放在单独的类库项目中,并在两个网站中引用它们。
谢谢@CFinck!只是给别人一个提示:我用这个改变了 ResourceManager 行:
New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())
我在 vb.net 但我认为在 C# 中唯一的区别是 + 而不是 & 来连接字符串。
这样我就可以在共享资源的两个类似项目中使用相同的链接程序集文件。
只是另一个案例。我复制了一个包含两个项目的解决方案,并在 Windows 资源管理器中对它们进行了部分重命名(文件夹名称、.sln 和 .csproj 文件名),部分在 Visual Studio 中通过大量的查找和替换操作(命名空间等)进行了重命名。尽管如此,仍然发生了 OP 声明的异常。我发现程序集和命名空间名称仍然很旧。
尽管该项目和其他所有内容都已命名为 OfficeStyle,但 Assembly name
和 Default namespace
仍命名为 Linkkus。
https://i.stack.imgur.com/YXQ3R.png
更正后一切正常,编译和运行时间:)
https://i.stack.imgur.com/8Jrfv.png
Dotfuscation 也会引发此错误,因为 resx 设计器文件依赖于反射。如果您使用的是 Dotfuscator,它将破坏您的 resx 文件。您必须始终将它们添加为混淆过程的排除项。
当我们使用
HttpContext.GetGlobalResourceObject()
除非我们将该调用包装在 try/catch 语句中,否则它将产生该错误。
对我来说,问题是将 .resx 文件和关联的 .cs 文件从一个项目复制到另一个项目。两个项目都有相同的命名空间,所以这不是问题。
当我在解决方案资源管理器中注意到原始项目中的 .resx 文件依赖于 .cs 文件时,终于解决了这个问题:
MyResource.cs
|_ MyResource.resx
在复制的项目中,.cs 文件依赖于 .resx 文件:
MyResource.resx
|_ MyResource.cs
事实证明,在第二个项目中,以某种方式将 .resx 文件设置为自动生成 .cs 文件。自动生成的 .cs 文件覆盖了从原始项目复制的 .cs 文件。
要解决此问题,请编辑复制项目中每个 .resx 文件的属性。自定义工具属性将设置为类似 ResXFileCodeGenerator。清除 .resx 文件的自定义工具属性。您需要从原始项目中重新复制 .cs 文件,因为它已被自动生成的文件覆盖。
这可能是由不匹配的命名空间引起的。第二个答案(Sibi Elango's)说右键单击 resx 文件,并将 Build 选项更改为 EmbeddedResource,但我已经这样做了,但仍然有错误。最佳答案(CFinck's)指出了一种通过手动编辑文件来解决此问题的方法,但是,我在 MonoDevelop 中遇到了这个问题,并且必须将默认命名空间设置为与调用资源的 cs 文件相同(该文件包含代码,例如下面的代码)...
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
通过 GUI 设置默认命名空间后,上面的行不再导致异常。
我有一个 WinForms 应用程序,解决方案中有一个项目。
定位 .NET Framework 4.0
使用 SharpDevelop 4.3
作为我的 IDE
听起来很傻,但我碰巧在我的 "Resources.resx"
文件中将 Logical Name
属性设置为 "Resources"
。一旦我清理了那个财产,一切都很好。
通常,当您将随机文件添加为 EmbeddedResource
时,您通常希望将 Logical Name
设置为合理的值,出于某种原因,我对 Resources.resx
文件做了同样的事情,结果搞砸了......
希望这可以帮助某人。
就我而言,添加到 Web.config
的这些代码行有很大帮助:
<system.web>
...
<globalization uiCulture="cs" culture="cs-CZ" />
...
<system.web>
连同构建操作:Embedded Resource
和自定义工具:PublicResXFileCodeGenerator
。
我在包管理器控制台中运行迁移命令时遇到了这个问题。Update-Database
。
接受的答案并没有解决我的问题。
我不得不将 Build Action 从 Compile
更改为 Embedded Resource
,它对我有用。
您可以使用以下步骤执行相同操作:
右键单击迁移。将“构建操作”属性“编译”更改为“嵌入式资源”运行更新数据库命令。
就我而言,我试图将表单从一个项目迁移到另一个项目。原来我只是忘记将 Form.resx
添加到新项目中。在表单中,我使用了一些图标,因此它依赖于资源。
我也面临同样的问题,尝试了答案中提到的所有解决方案,但似乎都没有奏效。原来,在将代码签入到 TFS 期间。 TFS 没有签入 Resx 文件,它只签入了设计器文件。所以所有其他开发人员在他们的机器上运行时都面临这个问题。手动签入resx文件就可以了
还有一个原因:如果您的命名空间有一个连字符(“-”),那么它将正确构建和运行,但资源将无法访问。命名空间(标识符)不应该有连字符,但这似乎在任何地方都没有强制执行,除了加载资源。在这十年里,这让我两次燃烧。
要检查的另一件事是您是否在 EmbeddedResource 上定义了 LogicalName 或 ManifestResourceName。如果您的项目文件正在使用它们,请确保正确定义它们,因为它们可能导致资源以您不期望的名称存在。
尝试在 EF 上运行 update-database 命令时遇到了同样的问题。结果是引发异常的迁移将 .resx 文件排除在项目之外。我只是右键单击 .resx 文件并单击“包含在项目中”。问题解决了。
在我的例子中,资源文件的 Build Action
已经是 Embedded Resource
但每次我运行 update-database
时,我都会遇到同样的错误,所以我做了其他步骤并且它有效:
将 Build Action 属性更改为 Compile Build(出现很多错误)将 Build Action 属性更改回 Embedded Resource update-database
由于某种原因,它起作用了。
对于 NetCore 项目有类似的问题,我注意到在添加迁移后(我们将其命名为 WhateverMigration
),作为 EmbeddedResource 的 .resx
文件引用没有添加到 .csproj
中,即使所有 似乎< /em> 很好。所以我打开了我的 .csproj
文件并添加了:
<EmbeddedResource Update="Migrations\202107071914322_WhateverMigration.resx">
<Generator></Generator>
<DependentUpon>202107071914322_WhateverMigration.cs</DependentUpon>
</EmbeddedResource>
在将 Windows 窗体 csproj
迁移到新的 SDK 样式项目格式时,您也可能遇到此异常。如果子文件夹中有任何表单或用户控件,则 *.resx
文件将使用包含子文件夹的命名空间生成,该命名空间可能与 *.Designer.cs
命名空间不匹配。解决方案是将以下内容添加到 csproj
:
<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
不定期副业成功案例分享