Доступ к файлу настроек другого проекта

есть ли способ получить доступ к файлу настроек из другого проекта? Например, у меня есть решение, содержащее 2 проекта (назовем их Proj1 и Proj2). Я хочу получить доступ к настройкам приложения Proj2 из программы.cs в Proj1. Возможно ли это?

6 ответов


вариант A: проанализируйте значения из файла конфигурации другой сборки (где хранятся настройки)

вариант B: создайте открытый класс в Proj2 который предоставляет необходимые значения из своих настроек в качестве статических свойств, а затем ссылается на сборку в Proj1 и потребляют значения из этого класса.

вариант C: Если вы хотите выставить все настройки, вы можете изменить доступ к классу настроек из internal to public.

Я конечно, есть и другие способы.


ответ, если вы используете c#:
очень простой ответ-щелкнуть правой кнопкой мыши по proj2, выбрать вкладку "Настройки". Вверху вы найдете модификатор доступа класса settings: internal, измените его на public. Добавьте ссылку на proj2 в proj1, чтобы увидеть класс настроек proj2. Вот и все.


Я перепечатаю содержимое ссылки @Kildareflare для дальнейшего использования. Все еще работает в VS2015, но для себя я думаю, что предпочитаю "вариант B" выше.

получение доступа к настройкам в другом проекте

одной из новых интересных функций Visual Studio 2005 является новый редактор свойств. С помощью этого редактора свойств вы можете легко добавить настройки в приложение. Но есть проблема в том, как это реализовано. Позволь мне объяснить тебе. почему?.

обычно настройки специфичны для проекта. При добавлении параметра в проект специальный пользовательский инструмент, связанный с файлом параметров, создает новый класс, который можно использовать для доступа к нему. Чем хорош этот класс сильно набирается. Но за кулисами он просто получает ключ из xml-файла. Этот сгенерированный класс задается как "внутренний запечатанный". Это предотвращает доступ из любой другой сборки. Что делать, если вы хотите централизовать, где вы редактируете эти настройки.

после многих попыток разоблачить его я нашел быстрый простой способ сделать это. Предположим, у нас есть 2 проекта в нашем решении: движок и WinApp. У каждого есть настройки, но мы хотим, чтобы они были доступны для редактирования из WinApp. Вот как это выглядит.

Settings Before

Если вы хотите получить доступ к настройкам двигателя здесь трюк: Добавьте файл ссылки.

Add Link

файл ссылки будет скомпилирован как часть как вы WinApp проекта. Класс настроек по-прежнему будет внутренним и запечатанным, но для проекта WinApp вместо Engine.

вот окончательный результат:

Settings After

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

С этим на месте вы можете получить доступ к вам двигатель установки путь от вас engine класса, как из класса WinApp. Вы можете опустите часть "Engine" из класса engine, потому что вы должны находиться в одном пространстве имен. Вот как это должно выглядеть:

namespace WinApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting = "test";
        }
    }
}

мне пришлось придумать другое решение, кроме тех, которые уже приведены здесь, потому что я использовал XML-Транформы (через SlowCheetah) в приложении.конфигурация моего проекта, содержащая настройки. Если вы этого не делаете, я рекомендую одно из других решений.

я добавил шаг после сборки в потребляющем проекте (Proj1 в примере), чтобы скопировать файл конфигурации из выходной папки Proj2. Это гарантирует, что в конфигурации будут применены преобразования. (В моем случае, Proj1 является dll, поэтому, если ваш exe, измените файлы DestinationFiles с ".файл DLL.config" в ".исполняемый.конфигурация.") Фрагмент из Проект1.csproj файл:

<Target Name="AfterBuild">
  <Copy SourceFiles="..\Proj2\bin$(Configuration)\Proj2.exe.config" DestinationFiles="$(TargetDir)$(AssemblyName).dll.config" />
</Target>

затем я создал ссылку на Настройки.настройки из Proj2 с помощью ctrl+shift + перетаскивание файла в Proj1 (как в статье блога, на которую ссылается Kildareflare).

я мог бы тогда ссылаться на настройки в Proj1, подобные: Proj2.Properties.Settings.Default.MySetting.

Примечание: Если вы делаете это для модульных тестов, как я (Proj1-тестовая DLL), и вы используете ReSharper тест бегун, обязательно настройте его для запуска тестов в отдельных AppDomains.


С Settings.Designer.cs это internal class, и вы не хотите возиться с сгенерированным файлом кода, я бы рекомендовал добавить вторичный как проект "друга".

From:в C# "внутренний" модификатор доступа при выполнении модульного тестирования

добавить следующий код Proj2 ' s AssemblyInfo.cs

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("Proj1")]

Я сам не тестировал этот метод, но маленький трюк Эрика де Каруфеля может быть тем, что вам нужно:

http://blog.decarufel.net/2007/10/getting-access-to-settings-in-another.html

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

исходный контент ниже:

получение доступа к настройкам в другом проекте

Четверг, 25 Октября 2007

один из новых интересных функций Visual Studio 2005 является новый редактор свойств. С помощью этого редактора свойств вы можете легко добавить настройки в приложение. Но есть проблема, как ее impelemented. Позвольте объяснить почему.

обычно настройки специфичны для проекта. При добавлении параметра в проект специальный пользовательский инструмент, связанный с файлом параметров, создает новый класс, который можно использовать для доступа к нему. Чем хорош этот класс сильно набирается. Но за сцена это просто получение ключа из xml-файла. Этот сгенерированный класс задается как "внутренний запечатанный". Это предотвращает доступ из любой другой сборки. Что делать, если вы хотите централизовать, где вы редактируете эти настройки.

после многих попыток разоблачить его я нашел быстрый простой способ сделать это. Предположим, у нас есть 2 проекта в нашем решении: движок и WinApp. У каждого есть настройки, но мы хотим, чтобы они были доступны для редактирования из WinApp. Вот как это выглядит.

Если вы хотите чтобы получить доступ к настройкам движка здесь-й трюк: Добавьте файл ссылки.

файл ссылки будет скомпилирован как часть проекта WinApp. Класс настроек по-прежнему будет внутренним и запечатанным, но для проекта WinApp вместо Engine.

вот окончательный результат:

обратите внимание, что я добавляю Фолер с тем же именем, что и мой проект двигателя. Это будет полезно, если вы хотите добавить настройки из многих проектов.

С этим на месте вы можете получить доступ к вам настройка двигателя путь от вас класса двигателя, как от вашего класса WinApp. Вы можете опустить часть "Engine" из своего класса engine, потому что вы должны находиться в том же пространстве имен. Вот как это должно выглядеть:

namespace WinApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting = "test";
        }
    }
}