C# System.IO.FileNotFoundException 尝试加载资源时(.Net Framework 4.8)

问题描述 投票:0回答:0

我有一个项目(它开始时是遗留代码),我一直在做这个项目。最近我需要发布最新版本,以便它可以在单独的计算机上使用。长话短说,通过视觉工作室使用一键式发布器,我不断收到 System.IO.FileNotFoundException。我使用 VS 调试器来追踪错误的位置。附加 assemblyResolve 处理程序后,我发现问题出在这行代码中:

this.imlProcesses.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imlProcesses.ImageStream")));

这里的代码路径如下。 Main() 运行 frmMain(代表 Windows 窗体的 MainForm 的部分类)。然后此函数调用 InitalizeComponent()。 componentResourceManager 最开始的几行代码之一是使用以下行设置的:

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));

然后它通过,进行正常的窗口窗体设计器设置,加载和实例化所有 GUI 组件,直到它到达上面显示的 imlProcesses 行。它到达这里,这就是它崩溃的地方。

根据我的理解,这是由于没有找到资源(.resx)文件造成的。我去尝试在发布设置中弄乱,看看是否可以确保 MainForm.resx 确实包含在内。在这样做的同时,我去测试应用程序,并在调试模式下运行它(请注意,到目前为止我唯一更改的是构建设置,没有代码),现在我在同一个地方得到了相同的 IO.FileNotFoundException!所以我恢复了我所做的所有更改、清理和重建程序,但我仍然收到错误!

目前导致问题的代码是遗留代码,到目前为止没有问题。我仍然可以提取我的最后一个版本控制保存,并且我将旧版本的 resx 属性匹配到新版本,但仍然没有修复。在这一点上,我对解决这个问题感到迷茫。即使我只是将我的最后一个版本控制保存更新为与我当前项目相同的功能,我仍然遇到无法将项目导出到另一台笔记本电脑的问题。

我是 C# 和 .net 的新手,任何或所有的想法/建议都非常感谢,因为我没有想法。谢谢!

我尝试过的一些事情: 将 .resx 属性恢复为以前的版本控制保存。

尝试了不同的属性变化。 (原来的save有build action set to Embedded Resource和Copy to output as Do Not Copy。这是当前项目在atm设置的)

还有很多,但是都是反复试验,不确定我经历了什么

---------------------------------------- 更新 ------ ------------------------------------------

所以我已经将问题追踪到与 winforms 自动生成的代码有关。 ComponentResourceManager 和 imlProcess 都是自动生成的行。

我使用 DotPeek 检查项目中包含的资源。在 PixyControl->Resources->EA.PixyControl.frmMain.resources 下确实包含了(我引用的名称空间是 EA.PixyControl)。

我当前的解决方案是用以下代码替换对 resources.GetObject 的任何引用:

using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EA.PixyControl.frmMain.resources"))
            {
                using (var resourceReader = new ResourceReader(stream))
                {
                    var resourceDict = resourceReader.Cast<DictionaryEntry>().ToDictionary(entry => entry.Key.ToString(), entry => entry.Value);
                    this.imlProcesses.ImageStream = (System.Windows.Forms.ImageListStreamer)resourceDict["imlProcesses.ImageStream"];
                }
            }

我想找到一个不同的解决方案,因为每当我更新窗体时,我的代码都会被删除(因为它正在修改自动生成的部分)。

我觉得答案在我的错误 System.IO.FileNotFoundException: 'Could not find file 'PixyControl.resources'.

我认为它会在 PixyControl.Resources 而不是 PixyControl.resources 中搜索。

这是我尝试访问的资源的 dotPeek 细分的屏幕截图:

c# winforms resx oneclick
© www.soinside.com 2019 - 2024. All rights reserved.