Можно ли получить доступ к ресурсам из другого проекта, используя конструктор в WinForms?

У меня есть довольно большое решение, в котором много проектов. В идеале я бы хотел создать проект "Ресурсы", содержащий все встроенные значки, которые мне нужны во время моего приложения.

Я читал статьи, в которых люди ссылаются на них через код, но можно ли получить доступ к этим ресурсам проекта в дизайнере? Другими словами, я бы хотел выделить ресурсы при нажатии на свойство BackgroundImage формы в дизайнере.

Если нет, какую архитектуру следует учитывать при попытке отделить мои ресурсы от моего основного проекта? Вероятно, это не разумная идея выпуска 100-битного исполняемого файла каждый раз, когда я изменяю строку кода или два.

Ответы

Ответ 1

Из лучших, что я могу сказать, вы не можете манипулировать ресурсами из других сборок в дизайнере. Только одно (-ы) из текущего проекта.

Вот как я это сделаю:

Создайте проект библиотеки классов. В библиотеке Add | Новый элемент | Файл ресурсов. Добавьте ресурсы (изображения, значки) в этот файл (например: Resource1.resx). В классе в этой библиотеке добавляются публичные члены, которые возвращают ресурсы.

public static class Class1
{
    public static Bitmap Image1 { get { return Resource1.Image1; } }
    public static Bitmap Image2 { get { return Resource1.Image2; } }
}

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

public Form1()
{
    InitializeComponent();

    this.BackgroundImage = ClassLibrary1.Class1.Image1;
}

Но, к сожалению, вы не можете использовать конструктора.:( Однако при этом вам не нужно будет перераспределять эту DLL, если вы не внесете никаких изменений в ресурсы в ней.

Ответ 2

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

Вы можете использовать Ресурсы из другой сборки, но, к сожалению, по причинам, объясняемым ниже, вы не можете сделать это через конструктора.

enter image description here

В проекте "Ресурсы" добавьте форму с изображением и установите BackgroudImage. Это просто, чтобы добавить изображение в проекты Resouces.resx и Resouces.Designer.cs. Мы можем удалить форму с помощью Picturebox после добавления изображения в качестве ресурса.

В проекте "Ресурсы" перейдите в раздел "Resouces.Designer.cs" и измените область "Класс" на "Общедоступно" и измените область "Методы визуализации" с "Внутренний на публикацию":

public static System.Drawing.Bitmap SO_down {
    get {
        object obj = ResourceManager.GetObject("SO down", resourceCulture);
        return ((System.Drawing.Bitmap)(obj));
    }
}

В проекте, который потребляет DLL ресурсов, вам нужно установить BackGroundImages НЕ использовать свои собственные ресурсы:

До:

this.pictureBox1.BackgroundImage = global::WinFormWithSatelliteResources.Properties.Resources.SO_down;

После:

this.pictureBox1.BackgroundImage = global::SatResources.Properties.Resources.SO_down;

какую архитектуру следует учитывать при попытке отделить мою ресурсов из моего основного проекта? Вероятно, это не разумная идея выпускать исполняемый файл 100mb каждый раз, когда я изменяю строку кода или два.

В наши дни большинство компаний с радостью полагаются на Интернет. Вы знаете, как вы можете использовать ресурсы версии, такие как MyStyle22022013.CSS и веб-браузеры не будут извлекать ресурс, если у них уже есть обновленная копия. Я предлагаю подобную стратегию, размещаю все эти графические ресурсы в сети, чтобы вы могли обновлять ресурсы без необходимости их упаковки и развертывания.

Когда вы думаете об этом так, зачем даже беспокоиться о собрании, полном ресурсов? Лабиринт просто извлекает ресурсы из Интернета и использует их из файловой системы.

Если начальный доступ к Интернету (для загрузки ресурсов) не является опцией, то @jross ответ кажется вполне жизнеспособным. В эти дни, хотя я не думаю, что вы планируете выпустить это на CD.

Ответ 3

Я нашел рабочий способ совместного использования файла ресурсов между многими проектами и поддерживать совместимость VS Designer (работает с VS 2012), это не сложно:

  • Создайте новый файл ресурсов в исходном проекте (названный в моем примере SharedResources.resx)

  • Откройте SharedResources.resx в Designer и измените Access Modifier на Public

  • Откройте .csproj вашего нового файла проекта в блокноте и добавьте следующий код в <ItemGroup>, который содержит <compile Include="MyForm.cs">: (будет включать *.resx и *.Designer.cs в качестве ссылки без компиляции и со специальным пространством имен)

    <EmbeddedResource Include="MY_SOURCE_PROJECT_FOLDER\Properties\SharedResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <Link>SharedResources.resx</Link>
      <LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
      <SubType>Designer</SubType>
      <CustomToolNamespace>MY_SOURCE_PROJECT_NAMESPACE.Properties</CustomToolNamespace>
    </EmbeddedResource>
    <None Include="MY_SOURCE_PROJECT_FOLDER\Properties\SharedResources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>SharedResources.resx</DependentUpon>
      <DesignTime>True</DesignTime>
    </None>
    
  • Замените MY_SOURCE_PROJECT_FOLDER на относительный путь вашего проекта, содержащий ресурсы, и замените MY_SOURCE_PROJECT_NAMESPACE пространством имен, указанным в сгенерированном файле SharedResources.Designer.cs (должно быть ваше глобальное пространство имен проектов)

  • Наслаждайтесь!

ВАЖНО:

  • Когда вы добавляете новые ресурсы в свой файл resx, откройте его из исходного проекта или файл будет добавлен в неправильную папку!
  • Когда вы просто добавили новый ресурс, если он не появился в новом проекте, просто перезапустите VS, он должен работать