Şu anda çalıştırılan DLL dosyasının konumunu nasıl öğrenebilirim?


94

Yazdığım bir dll'nin yürütülmesinin bir parçası olarak yüklemem gereken bir yapılandırma dosyam var.

Karşılaştığım sorun, uygulama çalışırken dll ve yapılandırma dosyasını koyduğum yerin "mevcut konum" olmaması.

Örneğin, dll ve xml dosyasını buraya koyuyorum:

D: \ Program Files \ Microsoft Team Foundation Server 2010 \ Uygulama Katmanı \ Web Hizmetleri \ bin \ Eklentiler

Ancak xml dosyasına (dll dosyamda) şu şekilde başvurmaya çalışırsam:

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

sonra . \ AggregatorItems.xml şu şekilde çevrilir:

C: \ windows \ system32 \ inetsrv \ AggregatorItems.xml

Bu yüzden, şu anda çalıştırılan dll'nin nerede olduğunu bilmenin bir yolunu bulmam gerekiyor (umarım). Temelde şunu arıyorum:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

Yanıtlar:


140

Sen arıyorsun System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

Not:

.LocationMülkiyet anda çalışan DLL dosyasının konumunu döndürür.

Bazı koşullar altında DLL, çalıştırılmadan önce gölge kopyalanır ve .Locationözellik, kopyanın yolunu döndürür. Orijinal DLL'nin yolunu istiyorsanız, Assembly.GetExecutingAssembly().CodeBasebunun yerine özelliği kullanın.

.CodeBasefile:\kaldırmanız gerekebilecek bir önek ( ) içerir .


8
Eyvah! Geri dönüyorC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano

23
Ah! Ama Assembly.GetExecutingAssembly().CodeBasevar!
Vaccano

2
CodeBase bana şu dosyayı verdi: \\ c: \ myassemblypath, ki bu tuhaf
Matt

10
@Matt gerçek bir ad almak için yeni Uri (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath kullanın
Larry

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell

37

Daha önce de belirtildiği gibi, düşünce arkadaşınızdır. Ancak doğru yöntemi kullanmanız gerekir;

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

16

Benim durumumda (derlemelerim [dosya olarak] Outlook'a yüklendi):

typeof(OneOfMyTypes).Assembly.CodeBase

Kullanımına dikkat CodeBase(değil Locationüzerine) Assembly. Diğerleri, montajı yerleştirmenin alternatif yöntemlerine işaret ettiler.


5
System.Reflection.Assembly.GetExecutingAssembly().Location

1

Bir asp.net uygulamasıyla çalışıyorsanız ve hata ayıklayıcıyı kullanırken derlemeleri bulmak istiyorsanız, bunlar genellikle geçici bir dizine yerleştirilir. Bu senaryoya yardımcı olmak için bu yöntemi yazdım.

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

Daha fazla ayrıntı için bu blog gönderisine bakın http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Kaynak kodunu değiştiremiyorsanız veya yeniden konuşlandıramıyorsanız, ancak bilgisayarda çalışan işlemleri inceleyebilirsiniz, İşlem Gezgini'ni kullanın. Ben ayrıntılı bir açıklama yazılı burada .

Sistemde çalışan tüm dll'leri listeleyecektir, çalışan uygulamanızın işlem kimliğini belirlemeniz gerekebilir, ancak bu genellikle çok zor değildir.

IIS içindeki bir dll için bunun nasıl yapılacağına dair tam bir açıklama yazdım - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -server /

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.