วิธีค้นหาพา ธ ของไฟล์แอปที่ใช้งานอยู่


167

ฉันพยายามจัดการข้อยกเว้นนี้ให้เสร็จ:

if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null)
{
    string pathOfActiveConfigFile = ...?
    throw new ConfigurationErrorsException(
       "You either forgot to set the connection string, or " +
       "you're using a unit test framework that looks for  "+
       "the config file in strange places, update this file : " 
       + pathOfActiveConfigFile);
}

ปัญหานี้ดูเหมือนจะเกิดขึ้นกับฉันเมื่อฉันใช้ nUnit เท่านั้น

คำตอบ:


363

ลองสิ่งนี้

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

หวังว่ามันจะช่วย


นี่เป็นวิธีที่ดีกว่าการพยายามใช้ Assembly.GetEntryAssembly () + ".config" ซึ่งไม่ทำงานในบางสถานการณ์ใน ASP.NET และในบางสถานการณ์เมื่อใช้ AppDomain
Contango

4
ฉันจะเปลี่ยนเส้นทางนี้ได้อย่างไร
Vignesh Subramanian

ขอบคุณ. ฉันมีโครงการอัพเกรดจาก VS2008 -> VS2013 ที่ปฏิเสธที่จะอ่านไฟล์ app.config จากนั้นฉันเรียนรู้ผ่าน AppDomain.CurrentDomain.SetupInformation.ConfigurationFile ว่ามันกำลังค้นหา XXX.vshost.exe.config ซึ่งไม่ได้ถูกสร้างขึ้น ดังนั้นฉันจึงปิด VS Hosting ในแท็บการดีบักคุณสมบัติของโครงการ จากนั้นฉันต้องเปลี่ยนชื่อไฟล์ app.config เป็น {projectName} .config วางไว้ในโฟลเดอร์ bin และในที่สุดก็ใช้งานได้
drzounds

1
ไม่ได้ผลสำหรับฉัน อย่างไรก็ตามคำตอบนี้ได้
Kay Zed

4
แล้ว. net core ล่ะ?
jjxtra

64

พูดอย่างเคร่งครัดไม่มีไฟล์การกำหนดค่าเดียว การแยก ASP.NET 1อาจมีไฟล์กำหนดค่าสามไฟล์โดยใช้การSystem.Configurationสนับสนุนinbuilt ( ) นอกเหนือจากการกำหนดค่าเครื่อง: การapp.exe.configโรมมิ่งผู้ใช้และผู้ใช้ภายใน

ในการรับการกำหนดค่า "global" ( exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

ใช้ConfigurationUserLevelค่าที่แตกต่างกันสำหรับการใช้งานข้ามเขตและไฟล์กำหนดค่าที่ไม่ใช่โรมมิ่ง


1ซึ่งมีรูปแบบที่แตกต่างกันอย่างสิ้นเชิงที่มีเนื้อหาของโฟลเดอร์ย่อย (IIS-เสมือนหรือระบบแฟ้ม) web.configสามารถ (ขึ้นอยู่กับการตั้งค่า) web.configเพิ่มหรือแทนที่ของผู้ปกครอง


2
ฉันเพิ่ม "คำตอบ" ครั้งแรกซึ่งเป็นประโยชน์มาก แต่ในตอนท้ายฉันต้องการแนวทางนี้จริง ๆ ดังนั้นขอบคุณที่วางไว้ที่นี่เช่นกัน
Noam Gal

อย่าลืมเพิ่มการอ้างอิงถึง System.configuration
Black Horus

9

หากคุณหมายความว่าคุณได้รับผลตอบแทนเป็นโมฆะเท่านั้นเมื่อคุณใช้ NUnit คุณอาจต้องคัดลอกค่า ConnectionString ของแอปพลิเคชั่นการตั้งค่าแอปพลิเคชันของคุณไปยังแอปการตั้งค่าไลบรารีทดสอบของคุณ

เมื่อมันรันโดยโหลดเดอร์โหลดแอสเซมบลีทดสอบจะโหลดที่รันไทม์และจะดูใน app.config ของตัวเอง (เปลี่ยนชื่อเป็น testAssembly.dll.config ในเวลารวบรวม) แทนที่จะเป็นไฟล์แอปพลิเคชันของคุณ

ในการรับตำแหน่งของชุดประกอบที่คุณใช้งานอยู่ให้ลอง

System.Reflection.Assembly.GetExecutingAssembly().Location

1
แนะนำ "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" จาก @Cedric Rup ไม่เช่นนั้นคุณจะได้รับข้อยกเว้นในบางสถานการณ์ใน ASP.NET และในบางสถานการณ์เมื่อใช้ AppDomains
Contango

6

ตรวจสอบให้แน่ใจว่าคุณคลิกคุณสมบัติในไฟล์และตั้งค่าเป็น "คัดลอกเสมอ" มิฉะนั้นจะไม่อยู่ในโฟลเดอร์ Debug \ ด้วยโปรแกรม Happy lil dll ของคุณเพื่อกำหนดค่าว่าจะต้องอยู่ที่ไหนและเพิ่มกระดึงมากขึ้น


6

ครั้งแรกที่ฉันตระหนักว่าโครงการทดสอบหน่วยอ้างอิง app.config ในโครงการนั้นค่อนข้างจะเป็น app.config ที่เกี่ยวข้องกับโครงการรหัสการผลิตของฉัน (นอกหลักสูตร DOH) ฉันเพิ่งเพิ่มบรรทัดในโพสต์กิจกรรมการสร้างโครงการ Prod ที่จะคัดลอก app.config ไปยังโฟลเดอร์ bin ของโครงการทดสอบ

แก้ไขปัญหา

ฉันไม่ได้สังเกตเห็นผลข้างเคียงใด ๆ ที่แปลก แต่ฉันไม่แน่ใจว่านี่เป็นวิธีการแก้ปัญหาที่ถูกต้อง แต่อย่างน้อยก็ดูเหมือนว่าจะใช้งานได้


4

อีกตัวเลือกหนึ่งที่ฉันเห็นหายไปที่นี่:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);

สิ่งที่ดีเกี่ยวกับเรื่องนี้คือแฮ็คที่มีลักษณะคือมันรวบรวมภายใต้. NET Standard 2.0 ส่งคืนค่า null ภายใต้. NET Core 2.0 แต่มีประโยชน์ในระหว่างการย้ายข้อมูล
EM0

3

ขึ้นอยู่กับตำแหน่งของไฟล์ปรับแต่งของคุณSystem.Reflection.Assembly.GetExecutingAssembly().Locationอาจทำในสิ่งที่คุณต้องการ


2
นอกจากนี้คุณสามารถมีไฟล์ปรับแต่ง "ใช้งาน" หลายไฟล์ได้ในเวลาเดียวกัน Machine.config, ระดับเฟรมเวิร์ก web.config, ระดับแอพปรับแต่ง ฯลฯ ... ดังนั้นฉันไม่คิดว่าจะมีวิธีการค้นหาตำแหน่งไฟล์สตริงการเชื่อมต่อที่ไม่ซ้ำกันโดยอัตโนมัติโดยไม่ต้องแยกวิเคราะห์ไฟล์ปรับแต่งที่เป็นไปได้ทั้งหมด
35432 William Edmondson

3

ฉันลองคำตอบก่อนหน้านี้หนึ่งในเว็บแอป (อันที่จริงบทบาทเว็บ Azure ทำงานในเครื่อง) และมันก็ไม่ได้ผล อย่างไรก็ตามวิธีการที่คล้ายกันนี้ใช้งานได้:

var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" };
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath;

ไฟล์ปรับแต่งอยู่ใน C: \ Program Files \ IIS Express \ MyComponent.dll.config สถานที่ที่น่าสนใจสำหรับมัน

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