Bagaimana cara mendapatkan lokasi DLL yang sedang dijalankan?

94

Saya memiliki file konfigurasi yang perlu saya muat sebagai bagian dari pelaksanaan dll yang saya tulis.

Masalah yang saya alami adalah bahwa tempat saya meletakkan dll dan file konfigurasi bukanlah "lokasi saat ini" saat aplikasi sedang berjalan.

Misalnya, saya meletakkan file dll dan xml di sini:

D: \ Program Files \ Microsoft Team Foundation Server 2010 \ Application Tier \ Web Services \ bin \ Plugins

Tetapi jika saya mencoba mereferensikan file xml (di dll saya) seperti ini:

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

lalu . \ AggregatorItems.xml diterjemahkan menjadi:

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

Jadi, saya perlu menemukan cara (saya harap) untuk mengetahui di mana dll yang sedang dieksekusi berada. Pada dasarnya saya mencari ini:

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

Jawaban:

140

Anda sedang mencari System.Reflection.Assembly.GetExecutingAssembly()

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

catatan:

The .Locationproperti mengembalikan lokasi file DLL yang sedang berjalan.

Dalam beberapa kondisi, DLL adalah bayangan yang disalin sebelum eksekusi, dan .Locationproperti akan mengembalikan jalur salinan. Jika Anda menginginkan jalur DLL asli, gunakan Assembly.GetExecutingAssembly().CodeBaseproperti sebagai gantinya.

.CodeBaseberisi awalan ( file:\), yang mungkin perlu Anda hapus.

Gelas pecah
sumber
8
Sayang! Itu mengembalikanC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano
23
Ah! Tapi Assembly.GetExecutingAssembly().CodeBaseapakah itu!
Vaccano
2
CodeBase memberi saya file: \\ c: \ myassemblypath, yang aneh
Matt
10
@Matt menggunakan Uri baru (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath untuk mendapatkan nama asli
Larry
2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell
37

Refleksi adalah teman Anda, seperti yang telah ditunjukkan. Tetapi Anda perlu menggunakan metode yang benar;

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.
Nicholas Carey
sumber
16

Dalam kasus saya (berurusan dengan rakitan saya dimuat [sebagai file] ke Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Perhatikan penggunaan CodeBase(tidak Location) pada Assembly. Yang lain menunjukkan metode alternatif untuk menemukan tempat berkumpul.


sumber
5
System.Reflection.Assembly.GetExecutingAssembly().Location
Hawxby
sumber
1

Jika Anda bekerja dengan aplikasi asp.net dan ingin mencari rakitan saat menggunakan debugger, rakitan biasanya diletakkan di direktori temp. Saya menulis metode ini untuk membantu skenario itu.

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

Untuk lebih jelasnya lihat posting blog ini http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Jika Anda tidak dapat mengubah kode sumber, atau menerapkan ulang, tetapi Anda dapat memeriksa proses yang berjalan di komputer menggunakan Process Explorer. Saya menulis deskripsi rinci di sini .

Ini akan mencantumkan semua dll yang sedang dijalankan pada sistem, Anda mungkin perlu menentukan id proses dari aplikasi yang sedang berjalan, tetapi itu biasanya tidak terlalu sulit.

Saya telah menulis deskripsi lengkap tentang bagaimana melakukan ini untuk dll di dalam IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -server /

Bryan
sumber