Совместная работа файлов конфигурации .NET 1.1 и .NET 2

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

Мое основное приложение VB6 (я буду называть его Alpha) имеет файл конфигурации (Alpha.exe.cnfig), который содержит настройки, используемые моей библиотекой DLL VB.NET 1.1 (которую я буду называть Bravo). После вызова Браво Альфа вызывает Чарли (моя DLL VB.NET 2). Однако, несмотря на то, что я изменил настройки приложения в 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 (моя DLL VB.NET 1.1)
\Application\Controls\Charlie\Charlie.dll (моя DLL VB.NET 2)
\Application\Controls\Charlie\Charlie.dll.config (этот файл игнорируется Charlie.dll)

Я перекомпилировал свою 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 under непосредственно под разделом appSettings (т. е. как еще один дочерний элемент элемента конфигурации) в Alpha.exe.config, тогда Bravo.dll выйдет из строя.

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


person Community    schedule 19.01.2009    source источник


Ответы (1)


Проблема, похоже, заключается в том, что поскольку Bravo.dll нацелен на 1.1, загружается версия 1.1 фреймворка, и, как вы говорите, раздел applicationSettings является новым в .NET 2.0. Решение состоит в том, чтобы заставить исполняемый файл VB загрузить структуру 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>
person Community    schedule 19.01.2009
comment
Это было то, что я имел в виду под, то есть прямо под, а не внутри, извините за путаницу. Я попробовал то, что вы предлагаете, и это вызывает ошибку автоматизации, я предполагаю, что .NET 1.1 не может понять раздел .NET 2 файла конфигурации. - person AnturCynhyrfus; 19.01.2009
comment
Я попытался добавить элемент configSections, как вы предложили, однако это по-прежнему приводит к сбою Bravo.dll (.NET 1.1) с ошибкой автоматизации, или, по крайней мере, об этом сообщает VB6. - person AnturCynhyrfus; 19.01.2009
comment
Я снова обновился, добавив supportRuntime, надеюсь, это наконец решит проблему. - person csgero; 19.01.2009
comment
Увы нет, я все еще получаю ошибку автоматизации. Я также пытался использовать requiredRuntime, но безрезультатно. Я боюсь, что моим единственным решением будет перенос Bravo.dll на .NET 2. - person AnturCynhyrfus; 19.01.2009