Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблема с конфигом


Автор: Competitor 22.6.2007, 17:03
Привет всем.
При попытке писать в конфиг:
Код

Settings1 set = Settings1.Default;
            set.TestData1 = 555;
            set.Save();

Ошибка: Property or indexer 'WriteToByteArray.Settings1.TestData1' cannot be assigned to -- it is read only.
Доюавил вручную в дизайнер.cs:
Код

set { this["TestData1"] = value; }

Стал получать exception: Configuration system failed to initialize.
Сам конфиг:
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5e089" >
            <section name="WriteToByteArray.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b7561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <WriteToByteArray.Settings1>
            <setting name="TestData1" serializeAs="String">
                <value>444</value>
            </setting>
        </WriteToByteArray.Settings1>
    </applicationSettings>
</configuration>

В чем моя ошибка?

Автор: tol05 23.6.2007, 15:32
Цитата(Competitor @  22.6.2007,  17:03 Найти цитируемый пост)
Доюавил вручную в дизайнер.cs

нельзя трогать код, сгенерированный студией.  Дело в том, что при переходе с кода в дизайнер, с дизайнера в код, студия сравнивает значения, введенные тобой через UI и написанный код. Если что-то самому писать - выскакивает всякий булшит... Вот динайнер и кричит, что не может провести инициализацию.

По поводу первой части вопроса: я когда-то имел дело с System.Configuration и у меня воспоминания остались самые неприятные. Пришлось в конце-концов отказаться от него (для решения моей хитрой задачи). Кривой этот намеспейс. Ну, или как в той фразе: "Вы не любите кошек? Да вы просто не умеете их готовить!"  smile 
У меня тоже проблемы были именно при записи настроек, менял я как раз их без проблем... То кричала студия, что файл такой уже есть и залочен, то эксепшены кидала...

Дай весь код. Посмотрю. Что такое Settings1? где лежит конфиг относительно приложения? Это ведь новая долбанная фича второго дотнета - не просто разрешать конфигурировать через API, но и требования по безопасности усилить...


Автор: stab 24.6.2007, 05:23
код, который вручную написал удали, и поменяй scope у TestData1 на User, а не Application. настройки приложения (scope=Application) не могут меняться пользователем (читай: во время выполнения).

Автор: Competitor 25.6.2007, 10:35
Пересоздал конфиг. Теперь scope=User. Exception не вылетает, но изменения не сохранются.
конфиг:
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="ConfigTest.SettingsForTest" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <ConfigTest.SettingsForTest>
            <setting name="x1" serializeAs="String">
                <value>46</value>
            </setting>
            <setting name="x2" serializeAs="String">
                <value>78</value>
            </setting>
        </ConfigTest.SettingsForTest>
    </userSettings>
</configuration>


Код 
Код

SettingsForTest settingsForTest = SettingsForTest.Default;
            settingsForTest.x1 = 77;
            settingsForTest.x2 = 78;
            settingsForTest.Save();


Код дизайнера:
Код

namespace ConfigTest {
    
    
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")]
    internal sealed partial class SettingsForTest : global::System.Configuration.ApplicationSettingsBase {
        
        private static SettingsForTest defaultInstance = ((SettingsForTest)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new SettingsForTest())));
        
        public static SettingsForTest Default {
            get {
                return defaultInstance;
            }
        }
        
        [global::System.Configuration.UserScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("46")]
        public int x1 {
            get {
                return ((int)(this["x1"]));
            }
            set {
                this["x1"] = value;
            }
        }
        
        [global::System.Configuration.UserScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("78")]
        public int x2 {
            get {
                return ((int)(this["x2"]));
            }
            set {
                this["x2"] = value;
            }
        }
    }
}


Кто-нить знает, из-за чего может быть проблема.

Автор: stab 26.6.2007, 02:37
settingsForTest.Save() точно вызывается? бряк на него поставь, проверь выполняется ли эта строчка.

кстати, у х2 назначаемое из кода значение совпадает со значением по умолчанию. может запутался при тестах?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)