2011-09-18 22 views
12

Bir ASP.NET web uygulamasının derleme adını başvurulan bir derlemeden almak mümkün mü?Geçerli uygulama derlemesi ne olursa olsun web uygulama derleme adı alın

Assembly.GetEntryAssembly, masaüstü ve konsol uygulamalarında iyi çalıştı ancak web uygulamalarında her zaman boş görünüyor ve GetExecuting \ GetCallingAssebly başvurulan derlememi döndürür, web uygulamasındaki değil.


Uzun açıklama:

yerine uygulama yapılandırma dosyasından yapılandırmayı okuma, bir merkezi konfigürasyon hizmetinden ayarlarını alır özel bir Settings Provider yazdı.

Özel sağlayıcı, ayrı bir derlemede olduğundan farklı uygulamalar tarafından kullanılabilir.

ApplicationName özelliğinin uygulama derlemesi adıyla geçersiz kılınması gerekir.

Sağlayıcıyı kullanmanın yolu, .net custom attribute olsa da, ona herhangi bir param gönderemiyorum.

Assembly.Get * Assembly yöntemlerinin hiçbiri işe yaramadığından, benim düşünebildiğim tek şey web uygulamaları için uygulama adıyla bir uygulama ayarlama gerektiriyor, ancak bundan gerçekten memnun değilim. Bu konuda herhangi bir yardım, teşekkür ederiz!

cevap

16

Bu eski bir soru olduğunu biliyorum ama bu biraz benzer bir duruma yaklaşımım oldu

BuildManager.GetGlobalAsaxType().BaseType.Assembly 
+3

"Bu yöntem, uygulamanın başlangıç ​​öncesi başlatma aşamasında çağrılmaz." ASP.NET MVC'de bu yöntemi kullanmaya çalışırken hata oluştu. – Tomas

+0

Bu, benim için "mscorlib" değerini döndürür. – Slavo

+1

Projenize Global.asax dosyası eklemediyseniz, bu çalışmaz. – Slavo

8

Sen

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

işe yaramıyor: (örn App_global.asax.hiqe17zm/... ApplicationInstance (ayarlar sağlayıcı başlatılır nerede)) (Application_Start null yöntemdir ve denetleyicileri içinden garip bir çalışma zamanı üretilen montaj döndürür, Sürüm = 0.0.0.0, Kültür = nötr, PublicKeyToken = null) – Pablote

+2

@Pabote: "BaseType" grubunun (kullanıcı kodunda tanımlanması gereken) montajını almayı deneyin. – SLaks

+2

Bir Global eklemezseniz bu işe yaramaz. projenizdeki .asax dosyası. – Slavo

0

deneyin kullanabilirsiniz. Benim durumumda, aynı çekirdeğe sahip birden fazla program için gösterilecek bir dizgiyi biçimlendirmek için başka bir derleme kullanıyordu. Bu statik yapıcı olduğu için

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); 

Yapmam gereken tüm Web uygulaması, bu statik sınıfının herhangi tesisi arayın ve ardından statik sınıftır montaj farklıdır son çağrı takımını bulmaktı üzerinde. Bu GetWebEntryAssembly yöntemi ile elde edildi.

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); 
} 
İlgili konular