2014-09-02 68 views
1

通过Nuget安装Phantomjs后,在包文件夹中有一个深层的可执行文件。该软件包还在项目根目录phantomjs.exe中放置链接/占位符。该文件不会出现在文件系统中,只能在Visual Studio中显示。它有一个指向物理文件的属性“完整路径”。如何使用Nuget包附带的链接的exe文件

如何从我的代码执行该文件?以下代码导致The system cannot find the file specified

var p = new Process(); 
var startInfo = new ProcessStartInfo 
{ 
    UseShellExecute = false, 
    RedirectStandardOutput = true, 
    RedirectStandardError = true, 
    FileName = @"~/phantomjs.exe" 
}; 
p.StartInfo = startInfo; 

p.Start(); 

回答

1

看一看真正的文件扩展名,它肯定是.LNK在这种情况下,它不会像东西CreateProcess的,这你使用的API肯定是周围的包装工作。如果它不是lnk文件,请检查它是否是硬链接或符号链接,并且目标是否存在。 shell上的“dir”会显示给你。如果它是一个lnk文件,你可以尝试使用ShellExecute,因为它看起来你的API已经为它提供了一个标志,或者甚至用一个自定义的创建硬或符号链接替换了lnk文件,或者需要使用cmd.exe,它应该能够像打开doc文件路径一样执行lnk文件。

+0

该文件没有出现在文件系统中,只出现在VS.它有一个属性“完整路径”,我需要在这种情况下使用。 – 2014-09-02 09:35:03

+0

完整的路径指向你的结构中真实的文件?在这种情况下,你需要做一些VS相关的“事情”,因为ShellExecute和CreateProcess都不知道这个特殊的VS链接。你不能简单地将它传递给Win32 API的包装器,你需要首先以某种方式解析它,或者确保你使用的API为你做了它,而这已经不是这种情况了。 – 2014-09-02 09:38:26

+0

是的,确切地说。那么为什么包裹的创造者甚至会在打不通的情况下放置这样的链接呢? Grrmmpf。随着每一个新版本的发展,这条道路将会发生变化,因此硬编码是很痛苦的。 – 2014-09-02 09:44:12

1

Nuget包实际上安装bin文件夹中的可执行文件的另一个副本,这是可用的一种方便的方式。

路径可以经由

HttpContext.Current.Server.MapPath("~/bin/") 

在的WebAPI进行映射。

0

检查phantomjs.exe的属性 - 它应该被复制到输出目录(“如果更新”或“始终复制”)。如果它不是 - 设置它。这样,可执行文件将被复制到构建中的输出目录,然后可供您的进程使用。

您的代码的问题是路径。这适用于我:

var p = new Process(); 
var startInfo = new ProcessStartInfo 
{ 
    UseShellExecute = false, 
    RedirectStandardOutput = true, 
    RedirectStandardError = true, 
    FileName = @"phantomjs.exe" 
}; 
p.StartInfo = startInfo; 

p.Start(); 
相关问题