Конфигурационные файлы .NET 1.1 и .NET 2 работают вместе - PullRequest
0 голосов
/ 19 января 2009

Я унаследовал довольно большой проект, состоящий из приложения, написанного на VB6, и нескольких элементов управления DLL и ActiveX, написанных на VB6, VB.NET 1.1 и VB.NET 2. Я хочу изменить одну из настроек для одной из библиотек DLL записано в VB.NET 2, которое находится в файле application.dll.config, но, похоже, не имеет никакого эффекта.

Мое основное приложение VB6 (я назову его Альфа) имеет файл конфигурации (Alpha.exe.cnfig), который содержит настройки, используемые моей библиотекой VB.NET 1.1 DLL (которую я назову Браво). После вызова Браво, Альфа звонит Чарли (моя библиотека VB.NET 2 DLL). Однако, несмотря на то, что я изменил настройки приложения в Charlie.dll.config в подкаталоге, в котором находится DLL, это не имеет никакого эффекта. Я попытался поместить настройки Чарли в конфигурационный файл Alpha, но это приводит к сбою Bravo с ошибкой автоматизации (что, я думаю, связано с тем, что формат файлов конфигурации изменился с .NET 1.1 и .NET 2).

Ниже приведена упрощенная структура каталогов и пример расположения файла:

\ Application \ Alpha \ Alpha.exe (мое приложение VB6)
\ Application \ Alpha \ Alpha.exe.config (этот файл конфигурации используется Bravo.dll)
\ Application \ Assembly \ Bravo.dll (моя библиотека VB.NET 1.1)
\ Application \ Controls \ Charlie \ Charlie.dll (моя библиотека VB.NET 2)
\ Application \ Controls \ Charlie \ Charlie.dll.config (этот файл игнорируется Charlie.dll)

Я перекомпилировал свою библиотеку VB.NET 2 с измененными настройками по умолчанию, я сделал это, чтобы проверить, нет ли ошибки кода в самой настройке, и это работает нормально. Тем не менее, я хочу быть в состоянии сообщить клиенту, как изменить файл конфигурации, чтобы он мог установить его так, как ему хочется, без необходимости повторной компиляции DLL каждый раз, когда ему нужны другие настройки.

Я хочу изменить только app.config, а не machine.config или user.config.

Вот пример Alpha.exe.config:

<configuration>
    <appSettings>
        <add key="MySetting" value="MyValue" />
    </appSettings>
</configuration>

А вот пример Charlie.dll.config

<configuration>
    <applicationSettings>
        <Charlie.My.MySettings>
            <setting name="MySetting" serializeAs="String">
                <value>MyValue</value>
            </setting>
        </Charlie.My.MySettings>
    </applicationSettings>
</configuration>

Если я попытаюсь поместить раздел applicationSettings в непосредственно под разделом appSettings (т. Е. Как другой дочерний элемент элемента конфигурации) в Alpha.exe.config, то Bravo.dll завершится ошибкой.

Заранее большое спасибо за любую помощь, которую вы можете оказать.

1 Ответ

0 голосов
/ 19 января 2009

Кажется, проблема в том, что, поскольку Bravo.dll нацелен на 1.1, загружается версия фреймворка 1.1, и, как вы говорите, раздел applicationSettings является новым в .NET 2.0. Решение состоит в том, чтобы заставить VB exe загрузить структуру 2.0. Добавление элемента startup/supportedRuntime в файл Alpha.exe.config должно помочь. Вам также понадобятся некоторые объявления раздела конфигурации, поэтому в конце Alpha.exe.config должен выглядеть примерно так:

<configuration>
    <startup>
        <supportedRuntime version="v2.0.50727" />
    </startup>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="Charlie.My.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </configSections>
    <appSettings>
        <add key="MySetting" value="MyValue" />
    </appSettings>
    <applicationSettings>
        <Charlie.My.MySettings>
            <setting name="MySetting" serializeAs="String">
                <value>MyValue</value>
            </setting>
        </Charlie.My.MySettings>
    </applicationSettings>
</configuration>
...