2012-03-03 24 views
5

tôi có thể làm điều này:Cách nào đúng để nhận tên của ứng dụng winforms của tôi?

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

hoặc

return Path.GetFileNameWithoutExtension(Application.ExecutablePath); 

cả sẽ cung cấp cho các ứng dụng tên mong muốn luôn ?? Nếu vậy, đó là một cách tiêu chuẩn hơn để nhận được tên ứng dụng? Nếu nó vẫn là một tình huống không thắng thì có gì giống như một phương pháp nhanh hơn phương pháp kia không? Hoặc người nào khác có cách tiếp cận nào khác đúng không?

Cảm ơn.

+2

Khó đoán ý bạn là gì bởi "tên ứng dụng", ngữ cảnh quan trọng. Cả hai sẽ trả về tên tập tin EXE * *. Tương tự như tên quy trình. –

+0

@ HansPassant oh, ý tôi là tên chính của sản phẩm của tôi. Ví dụ cho MS Word, nó là "Microsoft Word" và không phải "WINWORD". Trong trường hợp của tôi, cái tên mà tôi đã mã hóa cứng trong Thuộc tính ứng dụng dưới dạng Tên hội. Cách tiếp cận để đạt được điều đó là gì? – nawfal

Trả lời

1

Tùy thuộc vào cách bạn xác định 'tên ứng dụng'.

Application.ExecutablePath trả về đường dẫn cho tệp thi hành đã khởi động ứng dụng, bao gồm cả tên thực thi, điều này có nghĩa là nếu ai đó đổi tên tệp thì giá trị thay đổi.

Assembly.GetEntryAssembly().GetName().Name trả về tên đơn giản của hội đồng. Thông thường, nhưng không nhất thiết phải là tên tệp của tệp kê khai của hội đồng, trừ phần mở rộng của nó

Vì vậy, tên GetName().

Để có tốc độ nhanh hơn, tôi không biết. Tôi đoán rằng ExecutablePath nhanh hơn GetName() vì trong GetName() yêu cầu Reflection, nhưng điều này nên được đo.

EDIT:

Cố gắng để xây dựng ứng dụng giao diện điều khiển này, chạy nó và sau đó cố gắng đổi tên tập tin thực thi bằng cách sử dụng Windows File Explorer, chạy lại trực tiếp với kích đúp vào tập tin thực thi đổi tên.
Các ExecutablePath phản ánh sự thay đổi, tên hội vẫn là như nhau

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

Bạn có biết trong trường hợp nào chúng khác nhau không? tên thực thi (từ 'ExecutablePath') dường như chính xác tên của assembly. – nawfal

+0

Xem cập nhật trong câu trả lời – Steve

+0

cảm ơn .. Haa Tôi đã bỏ lỡ việc đó! :) – nawfal

4

Tùy thuộc vào những gì bạn đang cân nhắc là tên ứng dụng, thậm chí có tùy chọn thứ ba: nhận tiêu đề lắp ráp hoặc tên sản phẩm (tên thường được khai báo trong 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); 
} 

hoặc:

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

Cảm ơn, tôi sẽ quay lại .. – nawfal

+0

tại sao 'titleAttributes [0] được AssemblyTitleAttribute' kiểm tra xong ở đây? Chúng tôi đã truy vấn cùng một điều đúng không? – nawfal

+0

@nawfal: Có, bạn nói đúng, rất khó có thể các mục trong mảng sẽ thuộc loại nào khác, nhưng một số công cụ phân tích mã tĩnh nhất định (như ReSharper) sẽ đánh dấu mã này là một mối đe dọa tiềm ẩn 'NullReferenceException' vì' obj như T' biểu thức sẽ đánh giá để 'null' nếu' obj' không phải là 'T'. Bằng cách viết 'obj là T' trước' obj as T', những công cụ này sẽ biết tại thời gian biên dịch mà không có ngoại lệ nào được ném ra. –