Мы используем CSLA (довольно древнюю версию) в наших приложениях .NET 3.5, и мы используем загрузку приложений NetRun для некоторых наших пользователей. Для тех, кто не знаком с NetRun, NetRun.exe - это в основном «бегунок» приложения, который устанавливается на компьютерах пользователей (например, в c: \ Program Files \ NetRun \ NetRun.exe). Пользователь просто запускает приложение, запуская NetRun.exe.
Что делает NetRun.exe:
(1) Создает новый AppDomainSetup
Dim setupDomain As New AppDomainSetup()
setupDomain.ApplicationBase = CurrentDomainPath() ' this will be C:\Program Files\NetRun\
setupDomain.ConfigurationFile = "http://www.ourdomain.com/TheApp.xml" ' The app.config file is actually named TheApp.xml on the server because it has NetRun-specific config settings that don't belong in the standard TheApp.config that is used when the app is running directly from the server.
(2) Затем новый AppDomain создается с этим AppDomainSetup
' create new application domain
Dim newDomain As AppDomain = AppDomain.CreateDomain("TheApp", Nothing, setupDomain)
(3) Затем в этом новом домене приложений создается экземпляр NetRun.Launcher (класс помощника для запуска - в основном используется для общего экрана-заставки) через:
' create launcher object in new appdomain
Dim launcher As Launcher = CType(newDomain.CreateInstanceAndUnwrap("NetRun", "NetRun.Launcher"), Launcher)
(4) Затем вспомогательный класс luncher запускает приложение в новом домене приложений через
' use launcher object from the new domain to launch the remote app in that appdomain
launcher.RunApp()
(5) Который, после всего всплывающего экрана, приложение, наконец, запускается через
Dim ass = Assembly.LoadFrom("http://www.ourdomain.com/TheApp.exe")
ass.EntryPoint.Invoke(ass.EntryPoint, Nothing)
Итак, резюмируя, база приложения AppDomain действующего приложения - это C: \ Program Files \ NetRun \, а EntryPoint для реального приложения находится в "http://www.ourdomain.com/TheApp.exe". Пока все хорошо.
Само приложение, помимо TheApp.exe, также в качестве зависимости от ALibrary.dll. На сегодняшний день это прекрасно сработало для нас. Даже когда ALibrary.dll имеет записи конфигурации, которые были извлечены в файл TheApp.xml, эти записи конфигурации всегда читались нормально (и продолжают это делать).
В нашем следующем выпуске мы добавили новый раздел пользовательских файлов конфигурации, который определен в ALibrary.dll. Мы добавили новый раздел в файлы TheApp.xml и TheApp.config
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.Applicat...">
<section name="TheApp.My.MySettings" type="System.Configuration.ClientSettingsS..."/>
<section name="ALibrary.My.MySettings" type="System.Configuration.ClientSettingsS..."/>
</sectionGroup>
<!-- NEW CONFIG SECTION -->
<section name="fixedPriceExceptionModel" type="ALibrary.Configuration.FixedPrices.FixedPriceExceptionModelSection, ALibrary"/>
</configSections>
(части были ... вычеркнуты для экономии места в этом посте)
Однако, когда мы пытаемся получить доступ к новому разделу в NetRun, запускается TheApp.exe "обычным" способом через
CType(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) _
.GetSection("fixedPriceExceptionModel"), FixedPriceExceptionModelSection)
Мы получаем следующее исключение:
Произошла ошибка при создании
обработчик раздела конфигурации для
fixedPriceExceptionModel: не удалось
загрузить файл или сборку 'ALibrary' или
одна из его зависимостей. Система
не могу найти указанный файл.
(http://www.ourdomain.com/TheApp.xml
строка 8)
В некоторых исследованиях это связано с тем, что распознаватель сборок для библиотек конфигурации .NET ищет файл ALibrary.dll во всех обычных местах; ApplicationBase, конкретные подкаталоги, основные каталоги .NET, а затем GAC. К сожалению, ALibrary.dll никогда не будет найден ни в одном из этих мест. Когда это приложение запускается непосредственно на сервере, без NetRun, приложение не выдает исключение и правильно читает раздел конфигурации.
Одна вещь, которую я попробовал, состояла в том, чтобы установить AppDomainSetup по-другому, так как его ApplicationBase будет установлен в http://www.ourdomain.com/,, но затем последующий вызов CType (newDomain.CreateInstanceAndUnwrap ("NetRun", "NetRun.Launcher") , Launcher), потому что NetRun.exe не на сервере.
Вероятно, это много, и я надеюсь, что описал это достаточно хорошо (и не утомил вас). Возможно, не существует простого решения, но я исчерпал свои ограниченные знания в этой области и надеюсь, что у кого-то еще здесь, в SO, может быть волшебное исправление, позволяющее мне надежно получать доступ к пользовательским разделам конфигурации при запуске приложения как в NetRun, так и в локальной системе.