为使用Process.Start启动的exe指定DLL?

时间:2010-01-16 22:36:36

标签: c# dependencies exe process.start

我正在尝试使用Process.Start()启动可执行文件。当exe没有DLL依赖项时,它工作正常。但是,当我需要包含2个DLL时,它不起作用。我已经尝试设置WorkingDirectory,并验证了那里存在2个必需的DLL。有什么想法吗?

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "memcached.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = arguments;  //not shown           
startInfo.WorkingDirectory = Environment.CurrentDirectory;

try
  {
    using (Process exeProcess = Process.Start(startInfo))
      {
        exeProcess.WaitForExit();
      }
  }
    catch (Exception ex)
  {
    Trace.TraceError(ex.Message);  // never gets here
  }

这是code based on the Windows Azure Memcached Solution Accelerator。当memcached无法启动时,将显示一个对话框。遗憾的是,当代码在云中远程运行时,您无法看到这一点。

3 个答案:

答案 0 :(得分:1)

问题可能是您将WorkingDirectory设置为当前进程的当前目录(可能是任何位置,不一定是包含程序的目录)。尝试将工作目录设置为包含要启动的exe的目录。

另外,您是否确认DLL位于memcached.exe(或memcached.exe所需的位置)?

答案 1 :(得分:1)

我有类似的问题试图启动另一个需要DLL但无法找到它的进程。在我的情况下,解决方案非常简单,缺少'\'。

procInfo.WorkingDirectory = @"C:\filedir"; //won't work
procInfo.WorkingDirectory = @"C:\filedir\" ; //would do the trick

procInfo.WorkingDirectory = Enviroment.CurrentDirectory; //== "C:\filedir", that won't work either
procInfo.WorkingDirectory = Enviroment.CurrentDirectory + '\\'; // would work.

希望对你有所帮助。

答案 2 :(得分:0)

尝试将.EXE文件和引用的程序集放在同一位置,并将WorkingDirectory.WorkingDirectory定义到该文件夹​​。这可能会很好。

一个 extreme 替代方法是引用程序集(DLL)并将它们注册到GAC中的强名称。

在考虑这个选项之前,你应该用尽所有其他选择。