使用相对路径

时间:2017-07-25 16:37:36

标签: c# .net

尝试使用以下代码从C#解决方案运行外部可执行文件(带有依赖项)时,我得到Win32Exception File not found

public static string TestMethod()
{
    try
    {
        Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.FileName = Path.Combine("dist", @"test.exe");
        p.Start();
    }
    catch (Exception ex)
    {
        expMessage = ex.Message;
    }
    return expMessage;
}

说明:

  • 当绝对路径指定为FileName时,不会发生异常。
  • 在MS Visual Studio中,dist子文件夹文件属性设置为以下内容,dist目录确实已复制到输出文件夹中:
    • Build action: Content
    • Always copy in output directory
  • 我尝试使用test.exe.config文件,但未成功:
  

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="dist"/>
    </assemblyBinding>
  </runtime>
</configuration>

编辑 Specifying a relative path中提出的唯一一个在这种情况下有效的解决方案是最终由Viacheslav Smityukh作为评论提供的组合AppDomain.CurrentDomain.SetupInformation.ApplicationBase重建绝对路径的解决方案。然而,如下面的PavelPájaHalbich所述,在运行时似乎存在潜在的问题。从How can I get the application's path in a .NET console application?我发现了另一种基于Mr.Mindor评论的解决方案,使用以下代码:

string uriPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
string localPath = new Uri(uriPath).LocalPath;
string testpath = Path.Combine(localPath, "dist", @"test.exe");

现在我想知道考虑将来使用Window Installer部署解决方案的正确方法。

2 个答案:

答案 0 :(得分:1)

您案例中dist的路径是当前工作目录,与您的期望不一致。

尝试将路径更改为:

Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dist", @"test.exe");

答案 1 :(得分:0)

您需要指定该可执行文件的完整路径。因此,您可以使用SELECT * FROM mytable a WHERE EXISTS (SELECT userid, orderdate FROM mytable b WHERE a.userid = b.userid AND a.orderdate = b.orderdate GROUP BY userid, orderdate HAVING COUNT(*) > 1) 生成

System.Reflection.Assembly.GetExecutingAssembly().Location

正如您可以查看此问题running example,使用Path.Combine(System.IO.Path.GetDirectoryName( iSystem.Reflection.Assembly.GetExecutingAssembly().Location), "dist", @"test.exe"); 可以正常工作,但不推荐 - 可以在运行时更改。

编辑更正了获取目录而非完整位置可执行文件的答案。