[C#] 언제 UseShellExecute를 True로 설정해야합니까?

//
// Summary:
//     Gets or sets a value indicating whether to use the operating system shell
//     to start the process.
//
// Returns:
//     true to use the shell when starting the process; otherwise, the process is
//     created directly from the executable file. The default is true.
[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute { get; set; }

새로운 프로세스를 생성하면 언제 UseShellExecute를 True로 설정해야합니까?



답변

UseShellExecute부울 속성이 창문의 사용과 관련된 에서 ShellExecute 은 VS 기능 의 CreateProcess 기능 – 짧은 대답은 경우이다 UseShellExecute사실 그 Process클래스가 사용됩니다 ShellExecute그렇지 않으면 사용, 기능 CreateProcess.

더 긴 대답은 ShellExecute함수가 지정된 프로그램이나 파일을 여는 데 사용된다는 것입니다. 실행 대화 상자에서 실행할 명령을 입력하고 확인을 클릭하는 것과 거의 동일합니다.

  • 브라우저가 무엇인지 몰라도 기본 브라우저를 사용하여 .html 파일 또는 웹을 엽니 다.
  • Word의 설치 경로가 무엇인지 알 필요없이 Word 문서를 엽니 다.
  • 에서 모든 명령을 실행하십시오. PATH

예를 들면 다음과 같습니다.

Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();

사용하기가 쉽고, 다목적이며 강력하지만 몇 가지 단점이 있습니다.

  • 표준 입력 / 출력 / 오류 핸들을 리디렉션 할 수 없습니다

  • 자식 프로세스에 보안 설명자 (또는 다른 멋진 것들)를 지정할 수 없습니다

  • 실제로 실행될 항목에 대해 가정하면 보안 취약점이 발생할 가능성이 있습니다.

     // If there is an executable called "notepad.exe" somewhere on the path 
     // then this might not do what we expect
     p.StartInfo.FileName = "notepad.exe";
     p.Start();

CreateProcess프로세스를 시작하는 훨씬 더 정확한 방법입니다. 경로를 검색하지 않고 하위 프로세스의 표준 입력 또는 출력을 다른 방향으로 리디렉션 할 수 있습니다. 그러나 단점 CreateProcess은 위에서 설명한 세 가지 예 중 어느 것도 효과가 없다는 것입니다 (시도해보십시오).

요약 UseShellExecute하면 다음과 같은 경우 false로 설정해야 합니다.

  • 표준 입력 / 출력 / 오류를 리디렉션하려고합니다 (가장 일반적인 이유입니다)
  • 실행 파일의 경로를 검색하지 않으려는 경우 (예 : 보안상의 이유로)

반대로 UseShellExecute문서, URL 또는 배치 파일 등을 열려면 실행 파일의 경로를 명시 적으로 지정하지 않고 사실 을 유지해야 합니다.


답변

나는 주로 비 실행 파일을 생각합니다. 예를 들어 경우는 열려고하는 .html사용자가 설정해야하는 경우, 파일 UseShellExecutetrue해당이 열립니다 .html사용자가 기본값으로 설정되어 브라우저에서.


답변

에서 MSDN :

이 속성을 false로 설정하면 입력, 출력 및 오류 스트림을 리디렉션 할 수 있습니다.

UserName 속성이 null이 아니거나 빈 문자열이면 UseShellExecute가 false 여야합니다. 그렇지 않으면 Process.Start (ProcessStartInfo) 메서드가 호출 될 때 InvalidOperationException이 발생합니다.

운영 체제 쉘을 사용하여 프로세스를 시작하면 모든 문서 (기본 열기 조치가있는 실행 파일과 연관된 등록 된 파일 유형)를 시작하고 프로세스 구성 요소를 사용하여 인쇄와 같은 파일 조작을 수행 할 수 있습니다. UseShellExecute가 false이면 Process 구성 요소를 사용하여 실행 파일 만 시작할 수 있습니다.

ErrorDialog 속성을 true로 설정하면 UseShellExecute가 true 여야합니다.


답변

현재 응용 프로그램 실행 창을 숨기려면 UseShellExecute를 true로 설정해야합니다.


답변

경로에 공백이나 다른 특수 (예 : 악센트 부호가있는) 문자가 포함 된 경우 CreateProcess (UseShellExecute = false)는 짧은 파일 이름 ( “DOS”8.3 표기법)을 사용하는 것으로 보이며 ShellExecute (UseShellExecute = true)는 긴 파일 이름을 사용합니다. 따라서 UseShellExecute = false를 사용하는 경우 디렉토리 및 파일 이름을 8.3 이름으로 변환해야합니다 (google “.net 8.3 파일 이름을 얻는 방법”). (Windows 7, NTFS에서 테스트 한 Windows 버전 및 / 또는 파일 시스템이 어떤 식으로 작동하는지 확실하지 않습니다.)


답변