2008-11-07 35 views

Trả lời

20

Nếu bạn muốn nhận được tập tin cấu hình appdomain hiện tại, sau đó tất cả các bạn cần làm là:

ConfigurationManager.AppSettings ....

(điều này đòi hỏi một tham chiếu đến System.Configuration tất nhiên).

Để trả lời câu hỏi của bạn, bạn có thể làm điều đó như Ray đã nói (hoặc sử dụng Assembly.GetExecutingAssembly().FullName) nhưng tôi nghĩ rằng vấn đề được giải quyết dễ dàng hơn bằng cách sử dụng ConfigurationManager.

+0

Giải pháp này có hoạt động với ứng dụng asp.net không? Thư viện lớp tham chiếu có thể được sử dụng bởi các ứng dụng WinForms và ASP.NET –

+1

yep, đó là vẻ đẹp của ConfigurationManager. Nó chọn bất kỳ app.config/web.config nào phù hợp với miền ứng dụng. Điều này đã được giới thiệu trong .NET 2.0. –

+0

Tôi chỉ chạy một thử nghiệm với một ứng dụng asp.net và một ứng dụng WinFomrs và nó làm việc cho cả hai môi trường. Tôi hiện đang chạy thử nghiệm với dịch vụ WCF. Đây là trang web tôi đang gặp sự cố. –

47

Để có được câu trả lời cho tiêu đề câu hỏi:

// Full-name, e.g. MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
string exeAssembly = Assembly.GetEntryAssembly().FullName; 

// or just the "assembly name" part (e.g. "MyApplication") 
string exeAssemblyName = Assembly.GetEntryAssembly().GetName().Name; 

Như đã đề cập bởi @Ben, kể từ khi bạn đề cập đến mong muốn để có được thông tin cấu hình, sử dụng lớp ConfigurationManager.

+1

đòi hỏi using System.Reflection? –

+1

Có, đó là trong không gian tên System.Reflection. –

+0

Điều này đã được trả về từ cuộc gọi đó: MyApplication, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null –

3

Bạn không bao giờ nên ghép thư viện của mình với người tiêu dùng (trong trường hợp này là ứng dụng Web, WinForm hoặc WCF). Nếu thư viện của bạn cần cài đặt cấu hình, hãy GIVE nó vào thư viện.

Không mã hóa thư viện để lấy dữ liệu đó từ tệp cấu hình của người tiêu dùng. Cung cấp các nhà xây dựng quá tải cho điều này (đó là những gì họ đang có).

Nếu bạn đã từng xem đối tượng ConfigurationManager.AppSettings, nó chỉ đơn giản là một NameValueCollection. Vì vậy, hãy tạo một hàm tạo trong thư viện của bạn để chấp nhận một số NameValueCollection và để người tiêu dùng của bạn GIVE dữ liệu đó vào thư viện.

//Library 
public class MyComponent 
{ 
    //Constructor 
    public MyComponent(NameValueCollection settings) 
    { 
    //do something with your settings now, like assign to a local collection 
    } 
} 

//Consumer 
class Program 
{ 
    static void Main(string[] args) 
    { 
    MyComponent component = new MyComponent(ConfigurationManager.AppSettings); 
    } 
} 
7

Để có được tên chính xác mà không cần phiên bản vv sử dụng:

string appName = Assembly.GetEntryAssembly().GetName().Name; 

trình với NET v1.1 và sau đó.

+0

Nếu A.exe sử dụng B.dll và B.dll sử dụng C.dll, điều gì sẽ xảy ra nếu mã đó nằm trong C.dll? – Kiquenet

+1

Vẫn trả về A.exe, trừ khi A.exe không được quản lý, hoặc bất kỳ tệp dll nào được tải vào AppDomain riêng biệt. Để biết chi tiết, hãy xem: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly(v=vs.110).aspx –

+0

Tôi có Service.Host.dll và SvcImpl.dll (< % @ ServiceHost Service = "SvcImpl"%>) Máy chủ lưu trữ trong IIS. Mã này trong SvcImpl.dll: 1) Assembly.GetEntryAssembly() bị null. 2) Assembly.GetExecutingAssembly() lấy SvcImpl. 3) Assembly.GetCallingAssembly(); được System.ServiceModel. Làm thế nào tôi có thể nhận được Service.Host programatically trong SvcImpl nếu Assembly.GetEntryAssembly() được null? – Kiquenet

2

Nếu bạn muốn đọc (và hiển thị) số phiên bản:

Assembly ass = System.Reflection.Assembly.GetExecutingAssembly(); 
    AssemblyName assname = ass.GetName(); 

    Version ver=assname.Version; 

Một nơi nào đó trong ứng dụng (ví dụ: Tiêu đề khối trong một hình thức của Windows)

this.Text = "Your title Version " + ver; 
5

Bạn có thể nhận lắp ráp thông qua các lớp loại ...

typeof(MyClass).Assembly 
0

Nếu bạn muốn tên của EXE gốc chứ không phải hội đồng DLL được tham chiếu - bạn sẽ l cần sử dụng điều này:

Assembly.GetEntryAssembly().GetName().Name 

Điều này sẽ trả về tên EXE (trừ phần .EXE).

Sử dụng GetExecutingAssembly() không đúng theo câu hỏi của OP (đoạn đầu tiên của nó!) Vì nó sẽ trả về tên DLL.

0

Đối với tên viết tắt của một assembly từ một trường lớp:

Me.GetType().Assembly.GetName().Name 
Các vấn đề liên quan