2011-09-18 38 views
12

Có thể lấy tên lắp ráp của ứng dụng web ASP.NET, từ một assembly được tham chiếu không ??Lấy tên lắp ráp ứng dụng web, bất kể lắp ráp hiện tại là

Assembly.GetEntryAssembly hoạt động tốt trong các ứng dụng dành cho máy tính để bàn và giao diện điều khiển nhưng dường như luôn trống trong ứng dụng web và GetExecuting \ GetCallingAssebly trả lại assembly đã tham chiếu của tôi chứ không phải từ ứng dụng web.


lời giải thích dài:

Tôi đã viết một tùy chỉnh Settings Provider, mà thay vì đọc cấu hình từ tập tin ứng dụng cấu hình, nó được thiết lập từ một dịch vụ cấu hình tập trung.

Nhà cung cấp tùy chỉnh ở trong một hội đồng riêng biệt để nó có thể được sử dụng bởi các ứng dụng khác nhau.

Thuộc tính ApplicationName cần được ghi đè bằng tên lắp ráp ứng dụng.

Cách sử dụng nhà cung cấp mặc dù là .net custom attribute, vì vậy tôi không thể gửi bất kỳ thông số nào cho nó.

Vì không có phương thức Assembly.Get * Assembly có vẻ hoạt động, điều duy nhất tôi có thể nghĩ là yêu cầu ứng dụngĐặt tên ứng dụng cho ứng dụng web, nhưng tôi không thực sự hài lòng với điều đó. Bất kỳ trợ giúp nào với điều này đều được đánh giá cao, cảm ơn!

Trả lời

16

Hãy thử

BuildManager.GetGlobalAsaxType().BaseType.Assembly 
+3

Tôi nhận được "Phương thức này không thể được gọi trong giai đoạn khởi tạo trước khi bắt đầu của ứng dụng". lỗi trong khi cố gắng sử dụng phương pháp này trong ASP.NET MVC. – Tomas

+0

Điều này trả về "mscorlib" cho tôi. – Slavo

+1

Điều này không hoạt động nếu bạn không bao gồm tệp Global.asax trong dự án của mình. – Slavo

8

Bạn có thể sử dụng

HttpContext.Current.ApplicationInstance.GetType().Assembly 
+1

nó không làm việc:/... ApplicationInstance là null trong Application_Start() phương pháp (nơi cung cấp các thiết lập được khởi tạo), và bên trong bộ điều khiển trả về một lắp ráp tạo runtime lạ (ví dụ App_global.asax.hiqe17zm, Phiên bản = 0.0.0.0, Văn hóa = trung lập, PublicKeyToken = null) – Pablote

+2

@Pabote: Thử lấy assembly của BaseType của nó (cần được định nghĩa trong mã người dùng) – SLaks

+2

Điều này không có tác dụng nếu bạn không bao gồm Global tập tin .asax trong dự án của bạn. – Slavo

0

Tôi biết đây là một câu hỏi cũ nhưng đây là cách tiếp cận của tôi để một tình huống hơi tương tự. Trong trường hợp của tôi, tôi đang sử dụng một assembly khác để định dạng một chuỗi với phiên bản để hiển thị cho nhiều chương trình có cùng lõi.

Version v = null; 
var a = Assembly.GetEntryAssembly() ?? GetWebEntryAssembly() ?? Assembly.GetExecutingAssembly(); 
SnapshotVersion = FileVersionInfo.GetVersionInfo(a.Location).ProductVersion; 
if (ApplicationDeployment.IsNetworkDeployed) 
{ 
    var d = ApplicationDeployment.CurrentDeployment; 
    v = d.CurrentVersion; 
    v = new Version(v.Major, v.Minor, v.Revision); 
} 
else 
    v = a.GetName().Version; 
if (v != null) 
    version = string.Format("{0}.{1}.{2}", v.Major, v.Minor, v.Build); 

Bởi vì đây là trong một constructor tĩnh tất cả những gì cần làm là để gọi bất kỳ tài sản của lớp tĩnh này từ ứng dụng Web và sau đó tìm ra lắp ráp gọi cuối cùng đó là khác biệt so với lắp ráp rằng lớp tĩnh là trên. Điều này đã đạt được với phương thức GetWebEntryAssembly.

private static Assembly GetWebEntryAssembly() 
{ 
    var frames = new StackTrace().GetFrames(); 
    var i = frames.FirstOrDefault(c => Assembly.GetAssembly(c.GetMethod().DeclaringType).FullName != Assembly.GetExecutingAssembly().FullName).GetMethod().DeclaringType; 
    return Assembly.GetAssembly(i); 
}