Что происходит с настройками пользовательской области, когда сборка .NET является «ссылкой»? - PullRequest
0 голосов
/ 10 апреля 2009

У меня есть отдельное приложение WinForms, назовем его «Программа А». Программа A позволяет пользователю создать файл и сохранить в нем некоторую информацию. Программа А также предоставляет некоторые открытые уроки.

Другое автономное приложение WinForms («Программа B») ссылается на Программу A и использует некоторые из ее открытых классов.

Однако некоторым классам Программы А необходимо открыть файл, созданный пользователем, чтобы извлечь из него данные. В программе A местоположение файла пользователя сохраняется в «Настройках» (как, конечно, в настройках области действия пользователя) и извлекается (это приложение VB.NET) через My.Settings.

Это все хорошо до тех пор, пока не запустится программа B - когда она запускается и использует классы из программы A, которые должны считываться из My.Settings программы A, настройки остаются пустыми - как если бы они были сброшены (как при запустить программу А в первый раз или под новой учетной записью пользователя). Любые настройки application-scope сохраняются, но любые настройки user-scope сбрасываются до значений по умолчанию (какими бы они не были установлены в IDE при написании программы A).

Вот пример псевдокода:

Программа A:

Namespace ProgramA

    Public Class Foo

        Public Shared Function GetStuff() as Object
            File = OpenFile(My.Settings.UserFileName)
            Return File.ReadStuff()
        End Function

    End Class

End Namespace

Программа B:

TheStuffIWant = ProgramA.Foo.GetStuff()

Предположим, что пользователь уже запустил Программу А хотя бы один раз и открыл файл, поэтому следует установить My.Settings.UserFileName Программы А.

Когда программа B вызывает Foo.GetStuff(), она ничего не возвращает, потому что My.Settings.UserFileName не содержит имени файла пользователя - точнее, оно содержит любое значение «по умолчанию» для этого параметра (как установлено в IDE, когда вы устанавливаете настройку в первую очередь). Но если вы развернетесь и запустите Программу A, она запомнит настройки пользователя для UserFileName.

Итак - вопрос: При вызове функции в ссылочной сборке, почему настройки пользователя не сохраняются? Есть ли объяснение поведения, которое я вижу, или я упускаю что-то ужасно очевидное? Или, может быть, я просто ошибаюсь в этом, и я не должен был делать какие-либо публичные уроки в программе А во-первых, полагаться на что-либо в My.Settings?

1 Ответ

2 голосов
/ 10 апреля 2009

Ваша проблема в том, что пользовательские настройки читаются исполняемым приложением. Поскольку вы ссылаетесь на Программу A из Программы B, а не , выполняющей Программу A, классы в Программе A пытаются получить настройки, которые не были прочитаны Программой B.

Дело в том, что Программа B имеет свои собственные настройки, которые отделены от Программы A, и любой класс, который выполняется Программой B (независимо от того, где он определен), будет использовать настройки Программы B.

Так что с вашими настройками, так оно и есть, вам не повезло.

Если вы управляете как Программой A, так и Программой B, вы можете написать провайдера пользовательских настроек для обоих, который позволил бы им совместно использовать общие настройки пользовательской области.

В статье Архитектура настроек приложения есть раздел о том, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...