รับไดเรกทอรีของแอปพลิเคชันจากแอปพลิเคชัน WPF


170

ฉันพบวิธีแก้ไขปัญหาสำหรับแบบฟอร์ม Windows ด้วย AppDomain แต่สิ่งใดที่เทียบเท่ากับApplicationวัตถุWPF

คำตอบ:


329

วิธีการหนึ่ง:

System.AppDomain.CurrentDomain.BaseDirectory

อีกวิธีที่จะทำคือ:

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

อ่าขอบคุณ ต้องมองข้าม AppDomain อย่างใด ผมกำลังมองหามันจริง ...
โจอี้

3
@Helen: ตัดสินจาก upvotes นี่เป็นคำตอบที่ชัดเจน อย่างไรก็ตามคำตอบมีสองวิธีในการรับแอพ พวกเขาทั้งสองจะทำงานได้ดีเท่าเทียมกันหรือไม่
Christoffer Lette

21
ฉันจะใช้ทางเลือกแรก ดูเรียบง่ายขึ้นไม่มีการเรียกเมธอดและทำให้เกิดข้อสงสัยน้อยลงเกี่ยวกับสิ่งที่บรรทัดทำเมื่ออ่าน
Filip

3
ฉันใช้วิธีแรกในบริการ WCF ในแอปพลิเคชัน WPF และในโครงการ Class Library และทำงานได้ดีในทุก
Apostrofix

1
สำหรับ NetCore และ NetStandard ฉันอยากจะแนะนำอันที่สองเพราะ AppDomain ถูกเพิ่มเข้ามาใน 2.0 และไม่สามารถตั้งค่าได้ตามที่คาดไว้เสมอ
cdie

28

นี่คืออีก:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
หนึ่งนี้ได้รับการตั้งหลังจากเงาคัดลอกตามที่ระบุไว้ในเอกสาร ฉันไม่แน่ใจว่าคำแนะนำในคำตอบที่ยอมรับนั้นได้รับผลกระทบจากการคัดลอกเงาหรือไม่
Christoffer Lette

2
นี่ทำให้ไดเรกทอรีย่อยของ DLL ที่ฉันโทรหาไม่ใช่ไดเรกทอรีโปรแกรมหลัก
strattonn

7

คุณยังสามารถใช้อาร์กิวเมนต์แรกของอาร์กิวเมนต์บรรทัดคำสั่ง:

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


1
อย่างไรก็ตามโปรดทราบว่าแอปพลิเคชัน "ร้าย" สามารถแก้ไขอาร์กิวเมนต์บรรทัดคำสั่งได้
Daniel Rose

@Daniel: ทำไมมันถึงทำเอง? หรือคุณหมายถึงแอปพลิเคชันอื่น
Merlyn Morgan-Graham

1
@ Merlyn: ดูblogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspxฉันจะพูด: มันเป็น "พารามิเตอร์เริ่มต้นได้อย่างสะดวกในรหัสเริ่มต้นของกระบวนการ" ดังนั้นคุณสามารถปรับเปลี่ยนตำแหน่งหน่วยความจำนั้นได้โดยเจตนาหรือไม่ตั้งใจ
แดเนียลโรส

1
@Daniel: ใครสามารถ? กระบวนการอื่นหรือกระบวนการเดียวกัน หากคุณยิงด้วยเท้าคุณควรติดตามดูได้ง่าย ฉันจะเรียกสิ่งนั้นว่าชั่วร้ายน้อยลงและโง่มากขึ้น :) หากกระบวนการอื่นสามารถทำได้มันก็น่าสนใจกว่า แก้ไข: ฉันไม่เห็นอะไรเลยในบทความเกี่ยวกับการแก้ไขบรรทัดคำสั่งของโปรแกรมที่กำลังทำงานอยู่ - เฉพาะเมื่อกระบวนการเรียกใช้ส่งผ่าน (ไม่แน่ใจว่าเป็นสิ่งที่ไม่พึงประสงค์สำหรับกระบวนการเรียกใช้เพื่อเปลี่ยนบรรทัดคำสั่ง) และคุณสามารถสอบถามได้ ผ่าน WMI
Merlyn Morgan-Graham

@ MerlynMorgan-Graham แอปพลิเคชันที่เป็นอันตรายสามารถแก้ไขที่อยู่หน่วยความจำและบังคับให้แอปพลิเคชันของคุณเรียกใช้แอปพลิเคชันที่เป็นอันตรายอีกแอปหนึ่งแทน นี่คือสิ่งที่ชั่วร้ายเพราะสมมติว่าแอปพลิเคชันของพวกเขาเป็น keylogger และพวกเขาต้องการให้มันเปิดใช้งานทันทีที่คุณเปิดแอปพลิเคชันเฉพาะทาง ดังนั้นในรหัสของพวกเขาพวกเขาจะจับชื่อแอปพลิเคชันของคุณรัน keylogger ในพื้นหลังแล้วเรียกใช้แอปพลิเคชันของคุณ ผู้ใช้จะ clueless บทความอธิบายสิ่งนี้ แต่ไม่ได้บอกวิธีการทำ บางทีนั่นคือสิ่งที่คุณกำลังมองหา?
pqsk

6

ฉันใช้งานง่ายstring baseDir = Environment.CurrentDirectory;และทำงานให้ฉัน

โชคดี

แก้ไข:

ฉันเคยลบข้อผิดพลาดประเภทนี้ แต่ฉันชอบที่จะแก้ไขเพราะฉันคิดว่าจุดลบในคำตอบนี้ช่วยให้ผู้คนรู้วิธีที่ผิด :) ฉันเข้าใจโซลูชันข้างต้นไม่มีประโยชน์และฉันเปลี่ยนเป็นstring appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; วิธีอื่นเพื่อให้ได้:

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

โชคดี


3
นั่นคือไดเรกทอรีการทำงานปัจจุบัน มันอาจ conincide กับไดเรกทอรีแอพลิเคชัน แต่ผู้ที่มีแนวความคิดที่แยกต่างหาก (และที่สำคัญที่สุดไดเรกทอรีการทำงานสามารถเปลี่ยนแปลงได้เช่นถ้าคุณมีโต้ตอบแฟ้มทั่วไปเปิด)
Joey

1
@ Joey คุณพูดถูก ฉันเปลี่ยนเป็น: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; ขอบคุณ
QMaster


3

ลองสิ่งนี้ using System.Reflectionอย่าลืม

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

1

ฉันลองสิ่งนี้:

    label1.Content = Directory.GetCurrentDirectory();

และรับไดเรกทอรีด้วย


สิ่งนี้ได้รับไดเรกทอรีการทำงานปัจจุบันซึ่งอาจแตกต่างจากไดเรกทอรีกระบวนการ
Thraka

ฉันเดาว่าฉันต้องประเมิน Directory.GetCurrentDirectory (); มากกว่า. ขอบคุณ @Thraka สำหรับการแก้ไข
paul

0

คุณยังสามารถใช้ Application.StartupPath ได้อย่างอิสระจาก System.Windows.Forms แต่คุณต้องเพิ่มการอ้างอิงสำหรับ System.Windows.Forms assembly!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.