Посочете DLL файлове за 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
  }

Това е код, базиран на Windows Azure Memcached Solution Accelerator. Когато memcached не може да се стартира, се показва диалогов прозорец. За съжаление не можете да видите това, когато кодът се изпълнява дистанционно в облака.


person mhstack    schedule 16.01.2010    source източник
comment
Бих си помислил, че Process.Start() ще бъде твърде трудно за защита в azure и те биха го деактивирали? Azure не ви ли предоставя магически кеш като част от своя API? Имайте предвид, че не знам и съм любопитен.   -  person Spence    schedule 17.01.2010
comment
Спенс: Microsoft AppFabric Cache, известен още като Velocity, е техният разпределен кеш, но все още не работи в Azure. Тези дни можете да изпълнявате каквото искате в Azure, стига да не изисква администраторски привилегии.   -  person mhstack    schedule 17.01.2010
comment
уф Когато програмираш в облака, как знаеш откъде идва дъждът?   -  person Hans Passant    schedule 17.01.2010


Отговори (3)


Имах подобен проблем, опитвайки се да стартирам друг процес, който се нуждаеше от 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.

Надявам се това да ви помогне.

person JoseCastro    schedule 17.08.2010

Проблемът може да е, че задавате WorkingDirectory на текущата директория на текущия процес (която може да е навсякъде, не непременно директорията, съдържаща вашата програма). Опитайте да зададете работната директория на директорията, съдържаща exe файла, който искате да стартирате.

Също така проверихте ли, че DLL файловете са с memcached.exe (или на мястото, изисквано от memcached.exe)?

person Zach Johnson    schedule 16.01.2010
comment
Благодаря за мислите. Environment.CurrentDirectory е E:\approot и аз проверих, че и exe, и DLL файловете присъстват там. - person mhstack; 17.01.2010
comment
Добре. Не бях сигурен дали имах предвид, че DLL файловете са с вашата програма или с exe, който искате да стартирате. - person Zach Johnson; 17.01.2010

Опитайте се да поставите вашия .EXE файл и този референтен модул на едно и също място и да дефинирате своя WorkingDirectory.WorkingDirectory в тази папка. Това вероятно ще работи добре.

Една екстремна алтернатива е силно име, което препраща към сборки (DLL) и регистрирането им в GAC.

Трябва да изчерпите всички други алтернативи, преди да помислите за тази опция.

person Rubens Farias    schedule 16.01.2010
comment
За съжаление, не мисля, че можем да инсталираме DLL файлове в GAC в Azure. Да, поставих exe и DLL в същата папка. Благодаря все пак за вашите мисли. Тъй като изглежда просто, се чудя дали всъщност изпитвам различен проблем от това, което първоначално си мислех. - person mhstack; 17.01.2010