Mendapatkan direktori aplikasi dari aplikasi WPF

170

Saya menemukan solusi untuk Formulir Windows dengan AppDomain tetapi apa yang akan setara untuk Applicationobjek WPF ?

Joey
sumber

Jawaban:

329

Satu metode:

System.AppDomain.CurrentDomain.BaseDirectory

Cara lain untuk melakukannya adalah:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
Helen
sumber
Ah terima kasih. Pasti sudah mengabaikan AppDomain. Saya sedang mencari itu, sebenarnya ...
Joey
3
@Elen: Dilihat dari upvotes, ini jelas merupakan jawaban yang sangat baik. Namun, jawabannya memiliki dua cara untuk mendapatkan dir aplikasi. Apakah keduanya akan bekerja dengan baik?
Christoffer Lette
21
Saya akan menggunakan alternatif pertama. Terlihat lebih sederhana, tidak memiliki pemanggilan metode dan menyebabkan lebih sedikit keraguan tentang apa yang sebenarnya dilakukan baris ketika membaca.
Filipi
3
Saya telah menggunakan metode pertama dalam layanan WCF, dalam Aplikasi WPF dan dalam proyek Perpustakaan Kelas dan bekerja dengan baik di semua.
Apostrofix
1
Untuk NetCore dan NetStandard, saya akan merekomendasikan yang kedua, karena AppDomain ditambahkan pada 2.0 dan tidak selalu dapat ditetapkan seperti yang diharapkan
cdie
28

Ini yang lain:

System.Reflection.Assembly.GetExecutingAssembly().Location
Eddie Butt
sumber
2
Yang ini mendapatkan lokasi setelah penyalinan bayangan , sebagaimana dinyatakan dalam dokumen . Saya sebenarnya tidak yakin apakah saran dalam jawaban yang diterima dipengaruhi oleh penyalinan bayangan.
Christoffer Lette
2
Ini memberi saya sub direktori DLL yang saya panggil, bukan direktori program utama.
strattonn
7

Anda juga dapat menggunakan argumen pertama dari argumen baris perintah:

String exePath = System.Environment.GetCommandLineArgs()[0]

Balik
sumber
1
Namun, perhatikan bahwa aplikasi "jahat" dapat mengubah argumen baris perintahnya.
Daniel Rose
@Aniel: Mengapa itu melakukannya untuk dirinya sendiri? Atau maksud Anda aplikasi yang berbeda?
Merlyn Morgan-Graham
1
@Merlyn: Lihat blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Saya akan mengutip: ini adalah "parameter yang mudah diinisialisasi ke kode startup proses." Jadi Anda dapat dengan sengaja atau tidak sengaja mengubah lokasi memori itu.
Daniel Rose
1
@Aniel: Siapa yang bisa? Proses lain, atau proses yang sama? Jika Anda menembak diri sendiri di kaki, itu seharusnya mudah dilacak. Saya sebut itu kurang jahat, dan lebih bodoh :) Jika proses lain dapat melakukannya, maka itu lebih menarik. Sunting: Saya tidak melihat apa pun dalam artikel itu tentang memodifikasi baris perintah program yang sedang berjalan - hanya saja proses peluncurannya melewati itu (tidak yakin itu tidak diinginkan untuk proses peluncuran untuk mengubah baris perintah), dan Anda dapat menanyakannya melalui WMI.
Merlyn Morgan-Graham
@ MerlynMorgan-Graham aplikasi jahat dapat mengubah alamat memori, dan memaksa aplikasi Anda untuk menjalankan salah satu dari aplikasi jahat mereka. Ini jahat, karena katakanlah aplikasi mereka adalah keylogger dan mereka ingin aplikasi itu diaktifkan segera setelah Anda membuka aplikasi tertentu. Jadi dalam kode mereka mereka akan menangkap nama aplikasi Anda, menjalankan keylogger mereka di latar belakang, dan kemudian menjalankan aplikasi Anda. Pengguna tidak akan mengerti. Artikel itu menjelaskan hal ini, tetapi tidak memberi tahu Anda bagaimana melakukannya. Mungkin itu yang Anda cari?
pqsk
6

Saya menggunakan sederhana string baseDir = Environment.CurrentDirectory;dan ini berfungsi untuk saya.

Semoga berhasil

Edit:

Saya dulu menghapus kesalahan jenis ini tetapi saya lebih memilih untuk mengeditnya karena saya pikir poin minus pada jawaban ini membantu orang untuk mengetahui tentang cara yang salah. :) Saya mengerti solusi di atas tidak berguna dan saya mengubahnya ke string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Cara lain untuk mendapatkannya adalah:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

Semoga berhasil

QMaster
sumber
3
Itu direktori kerja saat ini. Ini mungkin bertepatan dengan direktori aplikasi tetapi itu adalah konsep yang terpisah (dan yang paling penting, direktori kerja dapat berubah, misalnya jika Anda memiliki dialog file umum terbuka).
Joey
1
@ joey kamu benar. Saya mengubahnya menjadi ini: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Terima kasih.
QMaster
3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Coba ini!

Arsen Mkrtchyan
sumber
3

Coba ini. Jangan lupa using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
Roshan J
sumber
1

Saya mencoba ini:

    label1.Content = Directory.GetCurrentDirectory();

dan dapatkan juga direktori.

paul
sumber
Ini mendapatkan direktori kerja saat ini, yang dapat berbeda dari direktori proses.
Thraka
Saya kira saya harus mengevaluasi Directory.GetCurrentDirectory (); lebih. Terima kasih @Traka untuk koreksi.
paul
0

Anda juga dapat menggunakan Application.StartupPath dari System.Windows.Forms, tetapi Anda harus menambahkan referensi untuk perakitan System.Windows.Forms!

jatuh
sumber