【问题标题】:How to start a process that is a resource?如何启动一个作为资源的进程?
【发布时间】:2022-12-18 12:14:09
【问题描述】:

我通过 resx 添加 test.bat 作为资源。然后我试试

proc.StartInfo.FileName = myNamespace.Properties.Resources.test;

但它说

System.ComponentModel.Win32Exception: The system cannot find the file specified.'

我怎样才能解决这个问题?

这是我的完整代码:

public async void button_A_Click(object sender, EventArgs e)
        {
            button_A.Enabled = false;
            await Task.Run(() => {
                var proc = new Process();
                proc.StartInfo.FileName = LOS_Installer.Properties.Resources.test;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.RedirectStandardError = true;
                proc.StartInfo.CreateNoWindow = true;
                proc.StartInfo.Arguments = path;
                if (proc.Start())
                {
                    void outputCallback(string data)
                    {
                        textBoxLog.AppendText(data);
                        textBoxLog.AppendText(Environment.NewLine);
                    }
                    proc.OutputDataReceived += (_, e) => Invoke(outputCallback, e.Data);
                    proc.ErrorDataReceived += (_, e) => Invoke(outputCallback, e.Data);
                    proc.BeginOutputReadLine();
                    proc.BeginErrorReadLine();

                }
                proc.WaitForExit();
            });
            button_A.Enabled = true;
        }

小问题:资源管理器似乎不关心文件的扩展名。那么,如果我有 2 个同名但扩展名不同的文件怎么办?

【问题讨论】:

  • 将资源复制到文件系统(例如临时文件夹)并从那里开始。
  • 你的意思是使用绝对路径?如果是这样,那么它就有效

标签: c# winforms resources


【解决方案1】:

此错误有几个潜在原因,解决方案将取决于项目的具体细节。以下是您可以尝试的几件事:

确保您尝试运行的文件确实作为资源包含在您的项目中。您可以通过在 Visual Studio 的“解决方案资源管理器”窗口中查找文件来检查这一点。如果不存在,您需要将其作为资源添加到您的项目中。

确保您尝试运行的文件在您的项目中被标记为“嵌入式资源”。默认情况下,作为资源添加的文件被标记为“内容”文件,这些文件不会编译到程序集中并且在运行时不可访问。要解决此问题,请在“解决方案资源管理器”窗口中右键单击该文件并选择“属性”。在“属性”窗口中,将“Build Action”属性设置为“Embedded Resource”。

当您指定文件的路径时,您需要使用正确的语法来访问资源。正确的语法是 myNamespace.Properties.Resources.test。请注意,资源的名称(在本例中为“test”)不区分大小写,但命名空间和类名称区分大小写。

如果您仍然遇到问题,可以尝试使用 ResourceManager 类的 GetObject 方法将资源作为 Stream 对象获取,然后使用 Stream.ReadToEnd 方法将文件内容读入字符串。然后,您可以使用 Process 对象的 StartInfo.Arguments 属性将文件的内容作为参数传递给您尝试运行的程序。

至于你的小问题,一个项目中可能有多个同名但扩展名不同的资源。但是,ResourceManager 类不提供任何内置方法来区分它们。如果您需要访问具有特定扩展名的特定资源,您将需要使用不同的方法,例如上一段中描述的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2012-12-04
    • 1970-01-01
    • 2015-07-10
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多