找不到适用于指定文化的任何资源(C# WinForm中的资源文件图像)

5
我在名为Resource1.resx的文件中添加了三个图片。我也添加了一个字符串,只是为了测试目的。无论是GetString还是GetObject(image-name),我都会遇到这个错误。
{"找不到适用于指定文化或中性文化的任何资源。请确保在编译时将“Resource1.resources”正确地嵌入或链接到程序集“TFBIC.RCT.Monitor”,或者所需的所有卫星程序集都可以加载并且完全签名。"}
    // get initial images 
ResourceManager rm = new ResourceManager(
    "Resource1",System.Reflection.Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;


string strTest = rm.GetString("String1");  // just testing 

Bitmap bmCircleGreen = (Bitmap)rm.GetObject("circleGreen");      
Bitmap bmCircleYellow = (Bitmap)rm.GetObject("circleYellow");      
Bitmap bmCircleRed = (Bitmap)rm.GetObject("circleRed");  

我的表单是项目中的第一类(我已经看到了那个错误)。
我已经为我的项目分配了一个强密钥,但没有用。
不确定还有什么其他尝试的方法。


1
这个答案解决了我的问题!GetGlobalResourceObject - DanielV
4个回答

4

你是否记得在引用资源时包含默认的命名空间/文件夹?

ResourceManager rm = new ResourceManager("DefaultNamespace.Folder.ResourceName");

如果您不确定正确的名称,请在Reflector中加载程序集并向下浏览以查看名称。


这不是一个"记住"而是"知道"的概念<微笑>。我从未在任何例子中看到过该命名空间。 - NealWalters
你还应该能够像nobugz在静态方式中提到的那样强类型获取它:FolderName.ResourceFileName.YourResourceName - Mikael Svenson

3
第一个参数是错误的。但是,已经为您创建了一个资源管理器。您可以查看它的代码:在“解决方案资源管理器”窗口中打开属性节点,打开Resources.resx节点,然后双击Resources.Designer.cs文件。
您可以使用Properties.Resources.ResourceManager获得其实例。如果您使用Project + Properties、Resources标签页(强烈推荐)添加位图,则只需按名称引用属性。比如Properties.Resources.circleGreen。请注意,每次使用该属性时,您会得到一个新的图像对象,如果您使用它超过一次,则可能需要将其复制到变量中。

我找到了这个:internal static global::System.Resources.ResourceManager ResourceManager。这就是你说的吗?不确定如何使用它。由于它是静态的,我尝试过"ResourceManager.getObject",但没有成功。 - NealWalters
抱歉,我再次阅读了您的帖子,它起作用了: Bitmap bmCircleGreen = (Bitmap) Properties.Resources.ResourceManager.GetObject("circleGreen"); - NealWalters

2
我也遇到了同样的问题。在以下行中,在resourcefileName之前添加"DefaultNameSpace."(在我的情况下,“BusinessLogic”是默认名称空间),解决了我的问题。
 public static ResourceManager rm = new ResourceManager(string.Concat("BusinessLogic." , Constants.Common.ResourceFileName), Assembly.GetExecutingAssembly());

1
今天我在使用VS设计器创建的Winform中遇到了同样的问题。我向menuStrip的一个项目中添加了一张图片:
this->menuitemFileSettings->Image = (cli::safe_cast<System::Drawing::Image^>
  (resources->GetObject(L"menuitemFileSettings.Image")));

自那时起,同样的错误就一直出现。在其他控件上进行图像测试也是一样的。
基于MS KB,Form类必须是代码中的第一个类。我的代码中这个部分没有问题。
资源文件与winforms类(frmMain)使用相同的名称(frmMain.resx)。
使用ILSpy检查创建的exe文件,我甚至在文件中找到了图像资源。事后我并不真正理解其中的原因。
我没有使用任何本地化。
我创建了一个新的Winform,将所有相关部分复制到那里,结果仍然失败。
不知怎么的,最终我偶然发现了项目设置中的“托管资源”条目。设置“资源文件名”的值为$(IntDir)\$(RootNamespace).$(InputName).resources,这是正确的,但当我意识到路径包含命名空间的名称时,我检查了命名空间,并发现我已经将其更改为NS_assemblies(从NS_Winform更改)。

现在已经将其改回来了,现在正常工作。 :-)
但我仍然不明白,资源内容
1)尽管命名空间错误,为什么被包含在exe中,以及
2)尽管已经包含了,为什么还找不到。


谢谢,由于这个问题的年代久远,我已经不再从事那个项目并且无法验证。 - NealWalters
1
我对那个相当有意识。我也添加了我的答案来帮助其他用户。 - Tobias Knauss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接