调用时,.exe进程未从C#应用程序运行

时间:2015-07-03 20:34:43

标签: c# shell gnupg

我写了一个应用程序,除其他外,使用GpgApi解密文件。我在C#中使用GpgApi来解​​密文件,如下所示:

 GpgInterface.ExePath = @"C:\Program Files (x86)\GNU\GnuPG\gpg.exe";

 GpgDecrypt decrypt = new GpgDecrypt(encryptedFile, file);
 decrypt.AskPassphrase = GetPassword;
 { 
    GpgInterfaceResult result = decrypt.Execute();
    Callback(result);
 }

我还从https://www.gnupg.org/download/安装了gpg classic,服务器中已经存在公钥和私钥。

现在,应用程序在我的开发机器中运行完美。它解密文件并将数据上载到数据库服务器。

但是,当我在服务器中运行代码时,出现以下错误:

at GpgApi.GpgInterface.<Execute>b__e(Object sender, EventArgs args) at System.Diagnostics.Process.RaiseOnExited() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(Object state, Boolean timedOut)

我不确定这意味着什么,服务器有公钥和私钥,并且安装了gpg classic(在同一路径中安装在我的开发机器上的相同版本)。此外,当我使用命令提示符运行gpg --decrypt时,它会解密该文件而不会出现任何问题。 bin文件夹中也提供了GpgApi.dll。该应用程序实际上是一个WCF服务库。知道我可能做错了吗?

IIS应用程序中的wcf服务包含所有必需的.dll。除Gpg解密外,其他所有工作都有效。

编辑:

这就是我在事件查看器中的内容:

Application: 61ReportsDecryptService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException
Stack:
   at GpgApi.GpgInterface.<Execute>b__e(System.Object, System.EventArgs)
   at System.Diagnostics.Process.OnExited()
   at System.Diagnostics.Process.RaiseOnExited()
   at System.Diagnostics.Process.CompletionCallback(System.Object, Boolean)
   at System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context(System.Object, Boolean)
   at System.Threading._ThreadPoolWaitOrTimerCallback.WaitOrTimerCallback_Context_f(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean)

我检查了文件权限,甚至给了#34; Everyone&#34;完全控制文件夹。那不行。

然后我删除了GpgApi,并启动了cmd进程来解密文件。这也没有用。上面的事件查看器是我使用GpgApi的时候。这是我用于解密的代码。

    string encryptedFile = dataFileLocation + filename;
    filename = filename.ToString().Substring(0, filename.ToString().IndexOf(".gpg")).ToString();
    string file = dataFileLocation + filename; //@"C:\MMS\Data\" + filename + ".mdb";
    string sCommandLine = "C:\\Program Files (x86)\\GNU\\GnuPG\\gpg.exe --passphrase password --output \"" + file + "\" --decrypt \"" + encryptedFile + "\"";

    this.WriteToFile("starting command line decryption");

    System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(@"cmd.exe");
    psi.CreateNoWindow = true;
    psi.UseShellExecute = false;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardInput = true;
    psi.RedirectStandardError = true;
    psi.WorkingDirectory = @"C:\Program Files (x86)\GNU\GnuPG";

    System.Diagnostics.Process process = System.Diagnostics.Process.Start(psi);

    string cmdLine = @"gpg.exe --passphrase-fd 0 -o C:\MMS\Data\test.mdb --decrypt C:\MMS\Data\filename.gpg";

    process.StandardInput.WriteLine(cmdLine);
    process.StandardInput.Flush();
    process.StandardInput.Close();
    process.WaitForExit();
    process.Close();

但由于某种原因,它根本没有运行。即使我没有提供密码,或者密码错误,它也不会告诉我。它根本不做任何事情。我甚至在try-catch块中使用它,异常从未触发过。如果我将上面的gpg.exe命令复制粘贴到命令提示符,那么它可以正常工作,但是从C#完成后不会做任何事情。我还有什么其他选择?

1 个答案:

答案 0 :(得分:0)

使用GpgApi解密文件时遇到了同样的问题。看起来这个库没有很好的设计。

最后我使用PgpSharp而不是GpgApi,它运行正常。