5

:내 winforms 응용 프로그램의 이름을 얻는 올바른 방법은 무엇입니까? 나는이 작업을 수행 할 수

return Assembly.GetEntryAssembly().GetName().Name; 

또는 둘 모두가 원하는 응용 프로그램 이름 항상 줄까요

return Path.GetFileNameWithoutExtension(Application.ExecutablePath); 

? 그렇다면 응용 프로그램 이름을 얻는보다 표준적인 방법은 무엇입니까? 만약 여전히 그것의 윈 - 윈 상황이 하나의 방법과 같은 것이 다른 것보다 빠르다면? 아니면 다른 방법이 있습니까?

감사합니다.

+2

"응용 프로그램 이름"이 의미하는 바를 추측하기 어렵습니다. 두 파일 모두 EXE * 파일 이름 *을 반환합니다. 프로세스 이름과 동일합니다. –

+0

@HansPassant 오, 내 제품의 주요 이름을 의미합니다. 예를 들어 MS Word의 경우 "WINWORD"가 아니라 "Microsoft Word"입니다. 제 경우에는 어셈블리 이름으로 응용 프로그램 속성에 하드 코드 된 이름입니다. 그것을 얻기위한 접근 방법은 무엇입니까? – nawfal

답변

1

'응용 프로그램 이름'을 정의하는 방법에 따라 다릅니다.

Application.ExecutablePath은 실행 파일 이름을 포함하여 응용 프로그램을 시작한 실행 파일의 경로를 반환합니다. 즉, 누군가가 파일 이름을 변경하면 값이 변경됩니다.

Assembly.GetEntryAssembly().GetName().Name은 어셈블리의 단순한 이름을 반환합니다. 일반적으로 어셈블리 매니 페스트 파일의 파일 이름에서 확장자를 뺀 것입니다.

따라서 GetName(). Name은 더 친숙 해 보입니다.

더 빠를수록 잘 모르겠습니다. 나는 GetName()에서 Reflection이 필요하기 때문에 ExecutablePath가 GetName()보다 빠르다고 추정하지만 이것은 측정되어야한다.

편집 :이 콘솔 응용 프로그램을 구축하여 실행 한 후 Windows 파일 탐색기를 사용하여 실행 파일 이름을 이름을 변경하려고하면 이름이 바뀐 실행에 더블 클릭으로 직접 다시 실행

보십시오.
ExecutablePath 변경 사항을 반영, 어셈블리 이름, 심지어 거기에 같은

using System; 
using System.Reflection; 
using System.Windows.Forms; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(Assembly.GetEntryAssembly().GetName().Name); 
      Console.WriteLine(Application.ExecutablePath); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

어떤 시나리오가 다른지 알고 있습니까? ('ExecutablePath'의) 실행 파일 이름은 정확하게 어셈블리의 이름처럼 보입니다. – nawfal

+0

답변에있는 업데이트를 참조하십시오 – Steve

+0

감사합니다. Haa 나는 그 해킹을 놓 쳤어! :) – nawfal

4

에서 봐 여전히 세 번째 옵션 : 어셈블리 제목 또는 제품 이름을 얻으십시오 (보통은 AssemblyInfo.cs에 선언 됨) :

object[] titleAttributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), true); 
if (titleAttributes.Length > 0 && titleAttributes[0] is AssemblyTitleAttribute) 
{ 
    string assemblyTitle = (titleAttributes[0] as AssemblyTitleAttribute).Title; 
    MessageBox.Show(assemblyTitle); 
} 

또는 :

object[] productAttributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), true); 
if (productAttributes.Length > 0 && productAttributes[0] is AssemblyProductAttribute) 
{ 
    string productName = (productAttributes[0] as AssemblyProductAttribute).Product; 
    MessageBox.Show(productName); 
} 
+0

고마워. 내가 돌아올거야. – nawfal

+0

왜 'titleAttributes [0]은 AssemblyTitleAttribute'가 여기에서 확인 되었습니까? 우리는 이미 똑같은 질문을 했습니까? – nawfal

+0

@nawfal : 그렇습니다. 배열의 항목이 다른 유형이 될 가능성은 거의 없지만 ReSharper와 같은 특정 정적 코드 분석 도구는이 코드를 잠재적 인 NullReferenceException 위협으로 표시합니다. 왜냐하면' 'obj'가'T'가 아닌 경우'obj as T' 표현식은 'null'로 평가됩니다. 'obj is T' 전에'obj is T'를 쓰면 컴파일시에 예외가 발생하지 않는다는 것을 알 수 있습니다. –