.exe进程在被调用时不是从C#应用程序运行的
本文关键字:应用程序 运行 进程 调用 exe | 更新日期: 2023-09-27 18:01:09
我写了一个应用程序,它使用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);
}
我还从安装了gpg classichttps://www.gnupg.org/download/,并且公钥和私钥已经存在于服务器中。
现在,该应用程序在我的开发机器中可以完美地工作。它解密文件并将数据上传到数据库服务器。
然而,当我在服务器中运行代码时,我会得到以下错误:
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时,它会解密文件而不会出现任何问题。GpgApi.dll也在bin文件夹中提供。该应用程序实际上是一个WCF服务库。你知道我做错了什么吗?
IIS应用程序中的wcf服务包含所有必需的.dlls。除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)
我检查了文件权限,甚至让"每个人"完全控制文件夹。那没用。
然后我删除了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#中执行时不会执行任何操作。我还有什么其他选择?
我在使用GpgApi解密文件时遇到了同样的问题。看起来这个图书馆设计得不好。
最后,我用了PgpSharp而不是GpgApi,效果很好。