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

时间:2009-03-09 19:36:42

标签: c# .net resources

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

5 个答案:

答案 0 :(得分:3)

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

提取:

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所指出的那样,不要忘记将资源标记为“嵌入式资源”。

答案 1 :(得分:0)

以下是从文本资源中获取文本的示例:

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

希望你能收集到如何使用它来执行可执行文件。

答案 2 :(得分:0)

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

您可以将解决方案资源管理器中可执行文件的“复制到输出目录”属性设置为“全部复制”或“如果更新则复制”以实现此目的。

答案 3 :(得分:0)

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

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

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

我会建议:

  1. 未将.exe嵌入为资源。只需将其Copy to Output Directory设置为Always。然后将其与主.exe

  2. 一起部署
  3. 将其作为资源嵌入,但将其保存到磁盘时,请使用Windows临时文件夹(如果只是一次性的话)或用户的数据文件夹(C:\ Documents and Settings \ [user] \申请数据)

  4. 您可以获取当前操作系统的正确文件夹:

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

答案 4 :(得分:-1)

您可以使用Assembly类 -

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等随机位置。