运行link86.exe时C#进程参数无效

问题描述:

下午好每个人。我接受了以前由其他人编写的C#编程任务。该程序最初调用两个perl脚本执行。那些perl脚本在90年代被写回,并且在调用各种8086可执行文件来组装和链接.a86文件之前,基本上做了很多格式化和过滤。运行link86.exe时C#进程参数无效

在开始时我重写了Perl脚本以提高速度并接受来自c#程序的参数。我不擅长解释原文的一些内容。

现在在C#程序中,我已经实例化了所有可执行文件的进程,并且除了运行link86.exe时我成功启动了它们之外,我也遇到了错误。该link86工艺具有以下信息:

Process test = new Process(); 
ProcessStartInfo testproc = new ProcessStartInfo(); 
testproc.FileName = path + "\\link86.exe"; 
testproc.Arguments = procData; // procData is a string 
test.testproc.Start(); 

/* I'm having trouble passing all of these objects as arguments 
* to link86. link86 does not like the '&' being in the string, 
* also the ' ' (space) is not required between arguments. After 
* 6 objects as arguments the command line returns the following error 
* 'The system cannot execute the specified program' it seems as if the 
* the command line is trying to execute the .obj file I don't know why 
* this is. 
* The error returned by the debugger says the 'Parameter was invalid' 
*/ 

procData = (in text visualizer) 
file.OBJ, & 
file2.OBJ, & 
TO outputfile.LNK OPTIONS 

procData = (when hovering over object) 
"file.OBJ, &\nfile2.OBJ, &\nTO outputfile.LNK OPTIONS" 

在命令行上,直到我进入第7个obj文件以下命令工作了。
link86 file.obj,file2.obj,... TO outputfile.LNK OPTIONS

我抬头约link86.exe一些信息,我发现了它有127个字符的命令行长度的限制。我正在尝试将大约95个.obj文件传递给link86作为参数。

如果我能找到一种方法,通过C#将90+参数传递给link86,这将非常有帮助。

感谢您在这件事情上的时间和考虑!

+0

另请参阅[使用open()for IPC](https://metacpan.org/pod/perlipc#Using-open-for-IPC)。 –

+0

思南Unur你是正确的,有两个问题。两者都导致相同的结果。我一直致力于让该程序以多线程方式执行所有这些任务,我通过将perl脚本作为不同进程执行,但GUI在执行期间冻结,从而实现了这一点。 C#似乎很善于处理文件和字符串,所以我不会抛出Perl代码,而是用一种新语言来利用它的功能。我想我对perl脚本不了解的是'^&'这类东西的作用和$ filename |确实。 –

+0

Sinan Unur,感谢IPC链接,我现在正在阅读它.... –

看问题的Perl的一部分:

open(FILE "link86 ^& < $tempfn|") || die "Could not run link86: $!\n"; 

这是一个语法错误。 FILE是一个裸词文件句柄。之后您需要一个逗号作为open的下一个参数。所以,该行应该是:

open(FILE, "link86 ^& < $tempfn|") || die "Could not run link86: $!\n"; 

第二个参数是shell执行的命令。尾部管道指示命令的输出将通过FILE文件句柄传送到您的程序。

^&将被执行该程序的shell解释。在这种情况下,我假设shell是cmd.exe^cmd.exe中的转义字符。因此,它会导致以下&被解释为文字字符。 (参见,Everyone quotes command line arguments the wrong way:“当CMD转换命令行,看到一个^,它忽略了^字符本身并复制下一个字符从字面上新的命令行...”)

我不完全相信它确实,但它似乎基本上执行link86使用$tempfn中的任何文件名的内容。

while(<LINK>) 
{ 
    print; # what does the print without parameters do? 
    if(/^(EXCEPTION|ERROR)/i) 
    { 
     $abflag = 1; 
    } 
    print $dlogH "\nabort Flag: $abflag\n"; 
} 

这读取来自LINK裸字的文件句柄。每行存储在$_中,然后打印。没有参数,print$_的内容打印到当前选定的输出文件句柄(最可能是STDOUT)。

如果该行包含EXCEPTIONERROR,它会设置中止标志。对于从LINK中读取的每一行,它将打印中止标志的值。一旦设置,中止标志保持置位状态。

+0

对不起,我在文件后忘了','。所以当link86被执行时,它会一次性获得'$ tempfn'中任何文件的内容,如:'link86 file.obj,file2.obj,file3.obj ...... file95.obj'或是他们一次只读一个?我认为他们都立即去,然后link86被执行,因为所有的对象文件需要链接在一起。我一直在玩这个命令行,看来link86一次需要所有的对象文件。我将如何模仿C#中的perl功能? –

+0

调用'“link86.exe ^&response.file”'不是Perl专用的。将它的输出配置到Perl程序中。 [如何:在C#中执行命令行,获得STD OUT结果](http://*.com/questions/206323/how-to-execute-command-line-in-c-get-std-out-results) ......接受的答案一次性提供输出,而不是一行一行地输出,但是您应该能够根据这一点确定去哪里。另请参见[Process.StandardOutput属性](https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx) –

+0

非常感谢!当我达到解决方案时,我将开始工作并发布信息! –