Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取已编译资源的路径?_C#_.net_Resources - Fatal编程技术网

C# 如何获取已编译资源的路径?

C# 如何获取已编译资源的路径?,c#,.net,resources,C#,.net,Resources,我已经在我的项目中包含了一个可执行文件(即,当您在VS2008的解决方案资源管理器中展开项目时,您会看到它和所有其他类)。这个可执行文件需要由我的程序启动。如何以编程方式检索其路径?下面是一个从文本资源获取文本的示例: Assembly assembly = Assembly.GetExecutingAssembly(); Stream stream = assembly.GetManifestResourceStream("ResourceTextFileName"); StreamReade

我已经在我的项目中包含了一个可执行文件(即,当您在VS2008的解决方案资源管理器中展开项目时,您会看到它和所有其他类)。这个可执行文件需要由我的程序启动。如何以编程方式检索其路径?

下面是一个从文本资源获取文本的示例:

Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream("ResourceTextFileName");
StreamReader textStreamReader = new StreamReader( stream );

希望您能够了解如何使用此功能来执行可执行文件。

您可以使用
程序集
类-

Assembly.GetExecutingAssembly().Location
应该指向你的跑步应用程序。使用该路径,去掉.EXE并添加可执行文件的文件名

string filename = Assembly.GetExecutingAssembly().Location;
filename = filename.Substring(0, filename.LastIndexOf("\\") + 1);
filename += "my_exe_name.exe";
Process.Start(filename);

请注意,这对webapps不起作用,但是,因为Location属性可能指向GAC之类的随机位置。

如果将可执行文件与项目一起部署到同一文件夹中,则可以使用Environment类获取可执行文件的工作目录。这将是:Environment.CurrentDirectory


您可以在解决方案资源管理器中将可执行文件的“复制到输出目录”属性设置为“全部复制”或“更新时复制”来完成此操作。

我以前从未对可执行文件执行过此操作。。。但是,如果它是一个嵌入式资源,您可以枚举应用程序中的嵌入式资源列表(或直接按名称引用),当您找到合适的资源时,将其写入磁盘,然后执行它

摘录:

Assembly assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream("resource name")
{
  using FileStream fs= new FileStream("executable name")
  {
    byte[] buffer = new byte[32*1024];
    int bytesRead;
    while ((bytesRead= stream.Read(buffer, 0, buffer.Length)) > 0)
    {
      fs.Write(buffer, 0, bytesRead);
    }
  }
}
执行:

using System.Diagnostics;

Process someProc;
someProc= Process.Start("executable name");

正如Daniel L所指出的,不要忘记将资源标记为“嵌入式资源”。

这并不是您所要求的,但在使用其他人发布的建议时可能会很有用:

请注意,如果您的应用程序是Windows窗体应用程序,并且最终安装在C:\Program Files中。。。如果启动应用程序的用户不是以管理员身份运行,则您可能没有对应用程序文件夹的写入权限

如果您想“提取”嵌入资源并将其保存到与应用程序相同的文件夹中的磁盘,则可能会出现问题

我建议:

  • 未将.exe作为资源嵌入。只需将其“复制到输出目录”设置为“始终”。然后将其与main.exe一起部署

  • 将其作为资源嵌入,但在将其保存到磁盘时,请使用Windows临时文件夹(如果只是一次性的)或用户的数据文件夹(C:\Documents and Settings\[User]\Application data)

  • 您可以获得当前操作系统的适当文件夹,如下所示:

    // for the Windows temp folder
    Path.GetTempPath() 
    
    // for the user's application data folder
    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))
    

    +1.提交了与我即将提交的内容完全相同的内容:((看起来是唯一真正理解问题的解决方案…)