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")
C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Assembly.GetExecutingAssembly().CodeBase
apakah itu!string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
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.
sumber
Dalam kasus saya (berurusan dengan rakitan saya dimuat [sebagai file] ke Outlook):
typeof(OneOfMyTypes).Assembly.CodeBase
Perhatikan penggunaan
CodeBase
(tidakLocation
) padaAssembly
. Yang lain menunjukkan metode alternatif untuk menemukan tempat berkumpul.sumber
sumber
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 /
sumber