2010-01-16 2 views
2

Process.Start()를 사용하여 실행 파일을 시작하려고합니다. exe DLL 종속성이없는 경우 제대로 작동합니다. 그러나 2 개의 DLL을 포함해야 할 때 작동하지 않습니다. WorkingDirectory를 설정하고 2 개의 필수 DLL이 있는지 확인했습니다. 어떤 아이디어?Process.Start로 시작된 exe에 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를 시작할 수 없으면 대화 상자가 표시됩니다. 불행히도 코드가 클라우드에서 원격으로 실행 중일 때는이를 볼 수 없습니다.

+0

나는 Process.Start()가 하늘색에서 보안하기에는 너무 어려울 것이라고 생각했을 것입니다. Azure가 API의 일부로 마법 캐시를 제공하지 않습니까? 나는 모르고 호기심에주의한다. – Spence

+0

Spence : Microsoft AppFabric Cache, 즉 "Velocity"는 분산 캐시이지만 Azure에서는 아직 작동하지 않습니다. 요즘은 관리자 권한이 필요하지 않는 한 Azure에서 원하는 모든 것을 실행할 수 있습니다. – mhstack

+1

으. 클라우드에서 프로그램 할 때, 비가 어디에서 오는 것인지 어떻게 알 수 있습니까? –

답변

1

WorkingDirectory을 현재 프로세스의 현재 디렉토리로 설정하는 것이 문제 일 수 있습니다. 프로그램을 포함하는 디렉토리 일 필요는 없습니다. 작업 디렉토리를 시작하려는 exe가 들어있는 디렉토리로 설정하십시오.

또한 DLL이 memcached.exe (또는 memcached.exe이 필요로하는 위치)인지 확인 했습니까?

+0

감사합니다. 'Environment.CurrentDirectory'는 E : \ approot이고 exe와 DLL이 모두 존재하는지 확인했습니다. – mhstack

+0

확인. DLL이 당신의 프로그램과 함께 있었는지, 또는 당신이 시작하기를 원하는 exe를 가지고 있는지 나는 확신하지 못했습니다. –

0

.EXE 파일을 놓고 같은 위치에 어셈블리를 참조하고 해당 폴더에 WorkingDirectory.WorkingDirectory을 정의하십시오. 이것은 아마도 잘 작동합니다.

하나의 극히은 어셈블리 (DLL)를 참조하고이를 GAC에 등록하는 강력한 이름입니다.

이 옵션에 대해 생각하기 전에 다른 모든 대안을 다 써야합니다.

+0

아쉽게도 저는 Azure에서 GAC에 DLL을 설치할 수 있다고 생각하지 않습니다. 네, 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. 

희망.

관련 문제