Может ли консольное приложение ссылаться на свой файл .exe.config, если он находится в другой папке? - PullRequest
1 голос
/ 04 марта 2011

Вот задание, которое мне дали на работе. У нас есть веб-приложение, для которого я создал консольное приложение, которое может выполняться по расписанию ежедневно. Задача, с которой я столкнулся, заключается в том, чтобы выяснить, можем ли мы разместить ConApp.exe и ConApp.exe.config в двух разных каталогах (папках) в нашем приложении. Мы хотели бы поместить файл .exe в папку bin со всеми файлами .dll и поместить файл .exe.config в папку центральной конфигурации. Я просматривал свойства и т.п. в Visual Studio и не вижу параметров, которые позволили бы мне указать ConApp.exe расположение файла ConApp.exe.config.

Есть ли способ поместить эти два файла в отдельные папки или они должны находиться в одной папке и иметь ссылку .exe.confing на центральный файл .config?

Спасибо,:)

Ответы [ 4 ]

1 голос
/ 04 марта 2011

Вы должны быть в состоянии использовать ConfigurationManager.OpenExeConfiguration, чтобы сделать это. Вы можете добавить параметр в файле конфигурации консольного приложения, который указывает путь и имя файла к файлу конфигурации, и передать это значение в OpenExeConfiguration (при условии, что консоль работает как учетная запись, у которой есть доступ на чтение к месту, где находится конфигурация). файл хранится).

Обратите внимание, что если ваше консольное приложение содержит операторы типа ConfigurationManager.AppSettings["somekey"], им потребуется некоторая переписка, чтобы они использовали объект Configuration, возвращаемый методом OpenExeConfiguration.

0 голосов
/ 04 марта 2011

Так что с помощью Фредрика Морка я смог найти это решение. Прежде всего, когда вы создаете свои консольные приложения, НЕ создавайте никаких настроек в окне свойств проектов. Это создаст файл app.config в вашем проекте, который, я считаю, исполняемый файл попытается найти и завершится сбоем, если не найдет его. Когда вы сначала создаете консольное приложение, а затем создаете его, прежде чем писать какой-либо код. Visual Studio создает папку Debug только с исполняемым файлом и несколькими вспомогательными файлами. Затем я поместил этот код в функцию «main»:

Dim fileMap As ExeConfigurationFileMap = New ExeConfigurationFileMap()

fileMap.ExeConfigFilename = "....../AppName.config"

Dim externalConfig As Configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None)

Dim appS As AppSettingsSection = externalConfig.Sections("appSettings")

Dim reportURL As String = appS.Settings("URL").Value

Console.Writeline(reportURL)

Во 2-й строке "fileMap.ExeConfigFilename =" ...... / AppName.exe.config "затем" ...... "представляют полный путь к файлу конфигурации, а AppName - имя вашего Теперь я также попытался скопировать код из моего исходного консольного приложения и запустить его, но он все еще не работает. Я думаю, что это из-за DLL-файлов, которые я использую, которые делают вызовы хранимых процедур в базе данных. Я считаю, что эти DLL ищите файл .config, который будет находиться в той же папке, так как они были построены таким образом, однако, если вы будете осторожны, когда начинаете писать приложение, вы можете использовать информацию Web.config, как я это делал выше.

0 голосов
/ 04 марта 2011

Нет, вы не можете указать своему приложению искать в другом каталоге его основной app.config.

Что вы можете сделать, это перенести некоторые разделы конфигурации во внешние файлы в другом каталоге:

<configuration>
   <appSettings configSource="config\appSettings.config" />
   <connectionStrings configSource="config\connections.config" />
</configuration>

Это работает - даже если в конструкторе Visual Studio будут жалобы по этому поводу - в любом разделе конфигурации .NET (но не в группах разделов, например, вы не можете экстернализировать все <system.web> или <system.serviceModel> сразу - нужно сделать это по их подэлементам.

0 голосов
/ 04 марта 2011

Автоматическое обнаружение .exe.config работает, только если файлы находятся в одной папке. Но вы сами ответили ИМХО: имейте ссылку .exe.config на другой файл .config в нужном центральном месте.

...