Làm cách nào để tìm đường dẫn của tệp app.config đang hoạt động?


167

Tôi đang cố gắng hoàn thành xử lý ngoại lệ này:

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

Vấn đề này dường như chỉ xảy ra với tôi khi tôi đang sử dụng nUnit.

Câu trả lời:


363

Thử cái này

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Hy vọng nó giúp


Điều này tốt hơn nhiều so với việc cố gắng sử dụng hội đồng.
Contango

4
Làm thế nào tôi có thể thay đổi con đường này?
Vignesh Subramanian

Cảm ơn bạn. Tôi đã có một dự án được nâng cấp từ VS2008 -> VS2013 đã từ chối đọc tệp app.config. Sau đó, tôi đã học được thông qua AppDomain.CienDomain.SetupIn information.ConfigurationFile rằng nó đang tìm kiếm XXX.vshost.exe.config không được tạo. Vì vậy, tôi đã tắt VS Hosting trong tab gỡ lỗi thuộc tính dự án. Sau đó, tôi phải đổi tên tệp app.config của mình thành {projectName} .config, đặt nó vào thư mục bin và cuối cùng nó đã hoạt động
drzound

1
Không làm việc cho tôi. Câu trả lời này đã làm tuy nhiên.
Kay Zed

4
Còn lõi .net thì sao?
jjxtra

64

Nói đúng ra, không có tập tin cấu hình duy nhất. Không bao gồm ASP.NET 1, có thể có ba tệp cấu hình sử dụng System.Configurationhỗ trợ inbuilt ( ). Ngoài cấu hình máy : app.exe.config, người dùng chuyển vùng và người dùng cục bộ.

Để có được cấu hình "toàn cầu" ( exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Sử dụng các ConfigurationUserLevelgiá trị khác nhau cho các tệp cấu hình chuyển vùng và không chuyển vùng mỗi lần sử dụng.


1 Có một mô hình hoàn toàn khác trong đó nội dung của các thư mục con (hệ thống tệp ảo hoặc IIS) web.configcó thể (tùy thuộc vào cài đặt) thêm hoặc ghi đè lên cha mẹ web.config.


2
Lần đầu tiên tôi bật "Trả lời", rất hữu ích. Nhưng cuối cùng tôi thực sự cần cách tiếp cận này, vì vậy cảm ơn vì đã đưa nó lên đây.
Noam Gal

Đừng quên thêm một tham chiếu đến System.configuration
Black Horus

9

Nếu bạn có nghĩa là bạn chỉ nhận được trả về null khi bạn sử dụng NUnit, thì có lẽ bạn cần sao chép giá trị ConnectionString của app.config của ứng dụng của bạn vào app.config của thư viện thử nghiệm của bạn.

Khi được chạy bởi trình tải thử nghiệm, hội đồng kiểm tra được tải trong thời gian chạy và sẽ tìm trong app.config của chính nó (được đổi tên thành testAss lanh.dll.config trong thời gian biên dịch) thay vì tệp cấu hình ứng dụng của bạn.

Để biết vị trí lắp ráp bạn đang chạy, hãy thử

System.Reflection.Assembly.GetExecutingAssembly().Location

1
Đề xuất "AppDomain.CienDomain.SetupIn information.ConfigurationFile" từ @Cedric Rup nếu không bạn sẽ gặp ngoại lệ trong một số tình huống trong ASP.NET và trong một số tình huống khi sử dụng AppDomains.
Contango

6

Hãy chắc chắn rằng bạn nhấp vào các thuộc tính trên tệp và đặt nó thành "sao chép luôn" hoặc nó sẽ không nằm trong thư mục Debug \ với lil dll của bạn để định cấu hình vị trí cần thiết và thêm nhiều chuông.


6

Lần đầu tiên tôi nhận ra rằng dự án thử nghiệm Đơn vị đã tham chiếu app.config trong dự án đó thay vì app.config được liên kết với dự án mã sản xuất của tôi (tất nhiên, DOH) Tôi vừa thêm một dòng trong Sự kiện Xây dựng bài của dự án Prod sẽ sao chép app.config vào thư mục bin của dự án thử nghiệm.

Vấn đề được giải quyết

Tôi đã không nhận thấy bất kỳ tác dụng phụ kỳ lạ cho đến nay, nhưng tôi không chắc chắn rằng đây là giải pháp đúng, nhưng ít nhất nó có vẻ hiệu quả.


4

Một lựa chọn nữa mà tôi thấy bị thiếu ở đây:

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

Điều thú vị về điều này, hacky như vẻ ngoài của nó, là nó biên dịch theo .NET Standard 2.0. Nó trả về null trong .NET Core 2.0, nhưng nó hữu ích trong quá trình di chuyển.
EM0

3

Tùy thuộc vào vị trí của tệp cấu hình của bạn System.Reflection.Assembly.GetExecutingAssembly().Locationcó thể làm những gì bạn cần.


2
Ngoài ra, bạn có thể có một số tệp cấu hình "hoạt động" cùng một lúc. Machine.config, web.config cấp khung, cấu hình cấp ứng dụng, v.v ... vì vậy tôi không nghĩ có cách nào để tự động định vị vị trí tệp chuỗi kết nối duy nhất mà không phân tích tất cả các tệp cấu hình có thể có cho ứng dụng của bạn.
William Edmondson

3

Tôi đã thử một trong những câu trả lời trước đó trong một ứng dụng web (thực ra là vai trò web Azure đang chạy cục bộ) và nó không hoạt động. Tuy nhiên, cách tiếp cận tương tự này đã làm việc:

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

Tệp cấu hình hóa ra là trong C: \ Program Files \ IIS Express \ MyComponent.dll.config. Nơi thú vị cho nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.