2012-10-18 27 views
18

My C# uygulaması ile, bir dosyaya çift tırnak içine tam yolunu yazar Uygulamamın yürütülebilir yolu bir #, garip bir şey içeriyor. Çıktı: 0'dan sonra eğik çizgi olur. Eğik çizgi (#) eğik çizgi olur. Bu, geliştirdiğim sistemle ilgili sorunlara neden oluyor.Odd C# yol sorunu

Bu neden oluyor ve yazı dizisinden daha zarif olanı önlemek için bir yol var mı?

+0

Bunu yeniden oluşturamıyorum. Uygulamam C: \ my # \ project \ foo.exe aracından çalışıyor ve yukarıda yazdığınız gibi Application.ExecutablePath dosyasını doğru yazıyor. Hata ayıkladığınızda, Application.ExecutablePath düzgün bir şekilde denetler mi? Burada gösterilmeyen yazı üzerinde herhangi bir post-processing yapıyor musunuz? – Joe

+2

Yeni bir projede, sadece dosyayı yazacak kodla yeniden test ettim. Hala yeniden üretiyor. Kullandığı çerçeve, fark yaratırsa 4.5. – Ryan

+0

Özellikle Elian'ın sonrası ışığında ilginç. Farklı yaptıklarını merak ediyorum (4.0 çerçevesini kullansam da ...) – Joe

cevap

9

Sadece Application.ExecutablePath kaynak koduna baktım ve uygulama aslında bu * geçerli:

Assembly asm = Assembly.GetEntryAssembly(); 
string cb = asm.CodeBase; 
var codeBase = new Uri(cb); 

if (codeBase.IsFile) 
    return codeBase.LocalPath + Uri.UnescapeDataString(codeBase.Fragment); 
else 
    return codeBase.ToString(); 

mülkiyet Assembly.CodeBase bir URI olarak yerini dönecektir. Bir şey gibi:

file:///C:/myfolder/myfile.exe

# bir URI'de parçası işaretleyici olduğu; parçanın başlangıcını işaretler. Görünüşe göre, Uri sınıfı, ayrıştırılıp tekrar bir dizeye dönüştürüldüğünde verilen uri'yi değiştirir.

string executablePath = Assembly().GetEntryAssembly().Location; 

* ) uygulaması bu daha karmaşıktır, aynı zamanda birden çok uygulama etki vardır durumlarla ilgilenir çünkü: Assembly.Location 'normal' dosya yolunu içerdiğinden

, ben senin en iyi alternatiftir tahmin ve diğer özel durumlar. En yaygın durum için kodu basitleştirdim.

+0

İlginç sorun .. Yine de Assembly.Location'a dönüştürdüm ve çözüldü. Teşekkür ederim :) – Ryan

1

Tek hata/hata. Her zaman doğru biçimde geri dönmek için bir işlevi yerine veya uzatma yöntemi kullanarak dışında yerine ExecutablePath ait

System.Reflection.Assembly.GetExecutingAssembly().Location 

kullanarak deneyebilirsiniz.