Uygulamanın dizinini bir WPF uygulamasından alma


170

AppDomain ile Windows Forms için çözümler buldum ama bir WPF Applicationnesnesi için eşdeğer ne olurdu ?

Yanıtlar:


329

Bir yöntem:

System.AppDomain.CurrentDomain.BaseDirectory

Bunu yapmanın başka bir yolu:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

Ah teşekkürler. AppDomain'i bir şekilde gözden kaçırmış olmalı. Aslında onu arıyordum ...
Joey

3
@Helen: Yukarı oylardan yola çıkarak, bu kesinlikle mükemmel bir cevap. Ancak, cevap app dir almak için iki yolu vardır. İkisi de eşit derecede iyi mi çalışacak?
Christoffer Lette

21
İlk alternatifi kullanırdım. Daha basit görünüyor, yöntem çağrısı yok ve satırın gerçekten okurken ne yaptığından daha az şüphe duyuyor.
Filip

3
İlk yöntemi bir WCF hizmetinde, bir WPF uygulamasında ve bir Sınıf Kütüphanesi projesinde kullandım ve hepsinde iyi çalıştım.
Apostrofix

1
NetCore ve NetStandard için, ikincisini tavsiye ederim, çünkü AppDomain 2.0'da eklendi ve her zaman beklendiği gibi ayarlanamadı
cdie

28

İşte bir başkası:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
Bu , dokümanlarda belirtildiği gibi gölge kopyalamanın ardından konumu alır . Aslında kabul edilen cevaptaki önerilerin gölge kopyadan etkilenip etkilenmediğinden emin değilim.
Christoffer Lette

2
Bu bana ana program dizini değil, aradığım DLL alt dizini verdi.
strattonn

7

Komut satırı bağımsız değişkenlerinin ilk bağımsız değişkenini de kullanabilirsiniz:

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


1
Ancak, "kötü" bir uygulamanın komut satırı bağımsız değişkenlerini değiştirebileceğini unutmayın.
Daniel Rose

@Daniel: Neden kendi kendine yapsın ki? Yoksa farklı bir uygulama mı demek istediniz?
Merlyn Morgan-Graham

1
@Merlyn: Bakınız blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Alıntı yapacağım: "sürecin başlangıç ​​koduna uygun şekilde başlatılmış bir parametredir." Böylece bu bellek konumunu kasıtlı olarak veya yanlışlıkla değiştirebilirsiniz.
Daniel Rose

1
@Daniel: Kim yapabilir? Başka bir süreç mi, yoksa aynı süreç mi? Kendinizi ayağa vurursanız, izini sürmek kolay olmalıdır. Buna daha az kötülük ve daha aptal diyeceğim :) Başka bir süreç bunu yapabilirse, bu daha ilginç. Düzenleme: Bu makalede çalışan bir programın komut satırını değiştirme hakkında hiçbir şey görmüyorum - yalnızca başlatma işleminin geçtiği (başlatma işleminin komut satırını değiştirmesinin istenmediğinden emin değilim) ve bunu sorgulayabilirsiniz WMI aracılığıyla.
Merlyn Morgan-Graham

@ MerlynMorgan-Graham kötü amaçlı bir uygulama bellek adresini değiştirebilir ve uygulamanızı kötü amaçlı uygulamalarından birini çalıştırmaya zorlayabilir. Bu kötülüktür, çünkü diyelim ki uygulamaları bir keylogger ve size özel bir uygulamayı açar açmaz etkinleştirilmesini istiyorlar. Bu yüzden kodlarında uygulama adınızı yakalar, keylogger'larını arka planda çalıştırır ve ardından uygulamanızı çalıştırırlar. Kullanıcı clueless olacaktır. Makale bunu açıklıyor, ancak bunu nasıl yapacağınızı söylemiyor. Belki de aradığın şey buydu?
pqsk

6

Basitçe string baseDir = Environment.CurrentDirectory;ve işini benim için kullandım.

İyi şanslar

Düzenle:

Ben bu tür bir hata silmek için kullanılan ama ben bu cevap eksi noktası insanların yanlış yolu hakkında bilmek yardımcı düşünüyorum çünkü ben bunu düzenlemek için tercih. :) Yukarıdaki çözüm yararlı olmadığını anladım ve onu almak için string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Diğer yolları olarak değiştirdim :

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

İyi şanslar


3
Geçerli çalışma dizini budur. Bu edebilir uygulama dizininde ile conincide ama bu ayrı kavramlardır (ve bir genel dosya iletişim açık olsaydı en önemlisi, çalışma dizini, örneğin değiştirebilirsiniz).
Joey

1
@ joey haklısın. Bunu şu şekilde değiştirdim: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Teşekkürler.
QMaster

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Bunu dene!


3

Bunu dene. Unutma using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

Bunu denedim:

    label1.Content = Directory.GetCurrentDirectory();

ve ayrıca dizini alın.


Bu işlem dizininden farklı olabilen geçerli çalışma dizinini alır.
Thraka

Sanırım Directory.GetCurrentDirectory () değerlendirmek zorunda; Daha. Düzeltme için Thraka'ya teşekkür ederim.
paul

0

Ayrıca System.Windows.Forms'dan Application.StartupPath'i özgürce kullanabilirsiniz, ancak System.Windows.Forms montajı için referans eklemeniz gerekir!

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.