2010-01-16 2 views
2

Я пытаюсь запустить исполняемый файл с помощью Process.Start(). Когда exe не имеет зависимостей между DLL, он работает нормально. Однако, когда мне нужно включить 2 библиотеки DLL, это не сработает. Я попытался установить WorkDirectory и проверил, что там находятся 2 требуемые библиотеки DLL. Есть идеи?Укажите DLL-файлы для exe, запущенного через Process.Start?

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 не может запускаться, отображается диалоговое окно. К сожалению, вы не можете видеть это, когда код работает удаленно в облаке.

+0

Я бы подумал, что Process.Start() будет слишком сложно защитить в лазурном режиме, и они бы отключили его? Разве Azure не предоставляет вам волшебный кеш как часть его API? Заметьте, что я не знаю, и мне любопытно. – Spence

+0

Spence: Microsoft AppFabric Cache, ака «Velocity», является их распределенным кешем, но он еще не работает в Azure. В эти дни вы можете запускать все, что хотите, в Azure, если оно не требует прав администратора. – mhstack

+1

Ugh. Когда вы программируете в облаке, откуда вы знаете, откуда приходит дождь? –

ответ

1

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

Кроме того, вы подтвердили, что библиотеки DLL с memcached.exe (или в месте, которое требуется memcached.exe)?

+0

Спасибо за мысли. 'Environment.CurrentDirectory' является E: \ approot, и я проверил, что там присутствуют как exe, так и DLL. – mhstack

+0

Хорошо. Я не был уверен, что это означало, что DLL были с вашей программой, или с exe, который вы хотите запустить. –

0

Постарайтесь разместить ваш .EXE-файл и эти ссылочные сборки в одном месте и определить ваш WorkingDirectory.WorkingDirectory в этой папке. Это, вероятно, будет работать нормально.

extreme альтернатива сильному имени, которое ссылается на сборки (DLL) и регистрирует их в GAC.

Вы должны исчерпать все другие альтернативы, прежде чем думать об этом.

+0

К сожалению, я не думаю, что мы можем установить DLL в GAC в Azure. Да, я поместил exe & DLL в ту же папку. Спасибо за ваши мысли. Поскольку это кажется простым, мне интересно, действительно ли у меня возникает другая проблема из того, что я изначально думал. – mhstack

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. 

Надеюсь, что вам поможет.

Смежные вопросы