Проблема с общими ресурсами WinForms между проектами в Visual Studio

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

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

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

Более конкретно, в диалоговом окне «Редактор изображений» (доступ к которому осуществляется из свойства «Изображение» существующего элемента управления) я выбираю «Выбрать из файла / ресурса ...» чтобы открыть диалоговое окно Select Resource (показано). Там, где я использовал для доступа ко всем локальным ресурсам проекта (Resources.resx), я хотел бы сейчас добавить доступ к новому проекту общих ресурсов. В идеале я бы добавил в раскрывающийся список второй элемент, который переключается на resx для проекта общих ресурсов.

Как это может быть сделано? Есть ли способ лучше?

альтернативный текст http://permalink.gennetten.com/SharedResourcesIssue.png

 John Saunders08 июл. 2009 г., 23:19
Winforms, веб-формы, версия?
 Douglas09 июл. 2009 г., 18:31
WinForms - .NET 3.5 - VS 2008

Ответы на вопрос(5)

Решение Вопроса

Я смог поделиться файлом resx между проектами и использовать его в конструкторе в VS 2008 SP1 (не знаю, другие версии). В отличие от других подходов, здесь ресурсы статически и динамически совместно используются, поэтому во время выполнения действительно существует одна копия совместно используемых ресурсов. Никаких потерь памяти или памяти, простота обслуживания с множеством проектов.

Следуйте инструкциям и скажите, работает ли он для вас

Create a class project Resources; Create a resource file (go to Properties -> Resources of the project); Move the resource file (default Resources.resx) to the root of the project; Rename the resources file Resources.resx -> GlobalResources.resx; Modify the resources file modifier to Public (double click on the resources file, "Access Modifier" -> "Public"); Copy any resource file to the root directory of the project; Add any resource to the resource file using "Add Existing File" and selecting resources on the root directory of the project.

Проект в обозревателе решений должен выглядеть следующим образом:

enter image description here

Теперь в любом проекте вам нужен файл resx, которым вы хотите поделиться:

Add the "Resource" project as a dipendency;

Edit manually the project file (*.csproj) and add the following lines in the resources file ItemGroup (create a local resource file if you want to see it):

<ItemGroup>
  ...
  <EmbeddedResource Include="..\Resources\GlobalResources.resx">
    <Link>GlobalResources.resx</Link>
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>GlobalResources.Designer.cs</LastGenOutput>
    <CustomToolNamespace>Resources</CustomToolNamespace>
  </EmbeddedResource>
  ...
</ItemGroup>

Очевидно, что & quot; Включить & quot; атрибут должен быть правильным относительным путем к GlobalResources.resx.

Use the resources in the designer as you was asking.

В моем проекте следующие строки создаются и добавляются в проект автоматически, когда я делаю это:

<Compile Include="..\Resources\GlobalResources.Designer.cs">
  <Link>GlobalResources.Designer.cs</Link>
  <AutoGen>True</AutoGen>
  <DesignTime>True</DesignTime>
  <DependentUpon>GlobalResources.resx</DependentUpon>
</Compile>

Если они не добавлены, добавьте их вручную.

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

enter image description here

Последние два шага:

Click on the linked "GlobalResources.resx" and on the Properties set "None" as the "BuildAction". "Custom Tool Namespace" should already be set to "Resources";

enter image description here

Click on the linked "GlobalResources.Designer.resx" and on the Properties set "None" as the "BuildAction".

enter image description here

И все готово: к этому моменту вы действительно сможете использовать ресурсы, которые вы добавили в общий ресурс в конструкторе, выбрав & quot; GlobalResources.resx & quot; в & quot; файле ресурсов проекта & quot; диалог вашего вопроса. И, как сказано, он действительно доступен даже во время выполнения! На панели «Свойства» вы должны увидеть полное пространство имен и класс внешнего проекта. Если вы удалите зависимость от & quot; Ресурса & quot; проект даже не компилируется. Если это не работает для вас, настаивайте, пока это не работает, и в случае, скажите мне, где руководство неверно. Это должно работать! Дай мне знать.

 10 окт. 2011 г., 18:15
Я не использую эту функцию, извините. Не знаете, для чего это полезно, можете ли вы привести пример? В конце концов, вам действительно нужно беспокоиться о пространствах имен, когда у вас есть общий проект со всеми ресурсами, динамически доступными для всего решения?
 20 дек. 2012 г., 08:57
Что делает установка BuildAction на None?
 20 дек. 2012 г., 11:26
Это заставляет GlobalResources.resx не компилироваться в каждом проекте, который его использует, сохраняя один экземпляр в одной общей сборке.
 28 нояб. 2011 г., 15:27
Спасибо ... это лучшее решение, чем то, которое я написал. Хитрость, которую я пропустил, - это установить «BuildAction». «Нет».
 05 окт. 2011 г., 07:05
Этот ответ кажется почти идеальным, единственная проблема, с которой я сталкиваюсь, заключается в том, что CustomToolNamespace по-прежнему относится к пространству имен проекта по умолчанию, не думаю, что вы знаете способ для этого "переопределить" пространство имен по умолчанию?
SHARING RESOURCES BETWEEN PROJECTS IN VS2012 in 3 easy steps using the designer only! create a project and add your resources to be shared as usual create another project and 'add as link' the resources.resx of the first project in the 'add existing item' Dialog, accessible from the context menu select images from the linked resource file as desired; this can be selected in the 'project resource file' pull down menu within the 'select resource' Dialog, accessible from the properties pane VOILA!
 13 сент. 2014 г., 00:10
Кажется, когда я добавляю, используйте дизайнер, чтобы добавить изображение в графическое окно в ссылочных проектах.
 13 сент. 2014 г., 00:00
Это работает, но попробуйте добавить изображения в GlobalResources в проекте ресурсов, как только вы ссылаетесь на изображения из кода в других проектах (которые ссылаются на проект lib класса ресурсов). Тогда Zut Alores!

куда вы включаете ресурсы (изображения, тексты и т. Д.). После в других проектах добавьте ссылку на это и используйте имя класса Resource для доступа к необходимому ресурсу, например: Project.SharedImages.Upload_64x64 (в результате получается растровое изображение, готовое к использованию в этом случае)

For Visual Studio 2015+

простой способ, который не поддерживается в пользовательском интерфейсе VisualStudio. Так что если вы не боитесь редактировать файлы проекта, читайте дальше.

Если вы еще этого не сделали, добавьте новый общий проект в решение.Add a New Shared Projecct

Если вы еще этого не сделали, включите новый общий проект в качестве ссылки на общий проект для своего периферийного проекта.enter image description here

Обратите внимание, как этот общий проект включен в периферийный проект (.csproj файл) прямым способом:

<Import Project="..\Common\Common.projitems" Label="Shared" />

Таким образом, хотя пользовательский интерфейс VS не предоставляет его, все в общем проекте (.projitems файл) входит непосредственно в периферийный проект. Добавление следующих определений ресурсов в общий проект (.projitems файл) будет включать их непосредственно в ваш периферийный проект. Но, потому чтоResource Элемент не поддерживается интерфейсом VS для общих проектов, эти файлы будут скрыты и игнорироваться в IDE.

<ItemGroup>
  <Resource Include="$(MSBuildThisFileDirectory)Resources\one 16x16.png" />
  <Resource Include="$(MSBuildThisFileDirectory)Resources\one 64x64.png" />
  <Resource Include="$(MSBuildThisFileDirectory)Resources\one.ico" />
  <Resource Include="$(MSBuildThisFileDirectory)Resources\two 16x16.png" />
  <Resource Include="$(MSBuildThisFileDirectory)Resources\three 16x16.png" />
  <Resource Include="$(MSBuildThisFileDirectory)Resources\four 16x16.png" />
  <Resource Include="$(MSBuildThisFileDirectory)Resources\five 16x16.png" />
  <Resource Include="$(MSBuildThisFileDirectory)Resources\six 16x16.png" />
</ItemGroup>

Наконец, тогда как ресурсы вашего периферийного проекта могут иметь относительные пути (например,".\Resources\main.ico"), эти ресурсы скомпилированы в ваш периферийный проект с базовыми идентификаторами, а не абсолютными или относительными. например.:

<Window x:Class="Common.Shared"
  ...
  Icon="one.ico">
  <Window.Resources>
    <ResourceDictionary>
      <BitmapImage x:Key="one64" UriSource="one 64x64.png"/>
    </ResourceDictionary>
  </Window.Resources>

Я недавно столкнулся с той же проблемой. Посмотрел документацию MS, но не смог найти хороших решений. В конце концов мне удалось заставить редактор изображений в конструкторе WinForms распознавать файлы ресурсов из других проектов, используя метод, описанный ниже. Это взломано - если у кого-то есть более чистое решение, которым он хочет поделиться, пожалуйста, напишите Я проверил это только на VS 2008.

Прежде чем начать, я должен сказать, что если вы просто хотите сделать элементы в файле Resources.resx доступными для других проектов, вы можете просто отредактировать его свойства и установить для общего доступа модификатор доступа для сгенерированного класса, чтобы он использовал PublicResXFileCodeGenerator. Гимнастика ниже необходима только в том случае, если вы хотите, чтобы дизайнеры WinForms брали изображения внутри этого файла ресурсов, как описано в посте выше от Дугласа.

Скажите, что ваше решение имеет следующую схему. Пространство имен по умолчанию для различных проектов (щелкните правой кнопкой мыши узел проекта в обозревателе решений -> Свойства -> вкладка Приложения) - здесь важно, поэтому я поместил это в скобки после названий проектов.

MySolution SharedProject (default namespace = SharedProject) SharedProject.csproj WinFormsProject1 (default namespace = WinFormsProject1) WinFormsProject1.csproj WinFormsProject2 (default namespace = WinFormsProject2) WinFormsProject2.csproj

Вы хотите создать файл ресурса вSharedProject содержащие изображения, которые могут быть использованыWinFormsProject1 а такжеWinFormsProject2.

Сначала создайте новый файл ресурсов в корнеSharedProjectдавайте назовем этоSharedResources.resx, Важно, чтобы этот файл использовал ResXFileCodeGenerator, а не PublicResXFileCodeGenerator, по причинам, которые станут понятны позже.

редактироватьSharedResources.resx в Visual Studio и добавьте ресурсы изображения, которыми вы хотите поделиться. Visual Studio также должна сгенерировать файл класса для вас внутриSharedProject называетсяSharedResources.designer.cs.

Ваше решение теперь должно выглядеть так:

MySolution SharedProject (default namespace = SharedProject) SharedProject.csproj SharedResources.resx SharedResources.Designer.cs WinFormsProject1 (default namespace = WinFormsProject1) WinFormsProject1.csproj WinFormsProject2 (default namespace = WinFormsProject2) WinFormsProject2.csproj

Если вы откроетеSharedProject.csproj в текстовом редакторе вы должны увидеть следующие записи:

<EmbeddedResource Include="SharedResources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<Compile Include="SharedResources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>SharedResources.resx</DependentUpon>
</Compile>

Теперь вам нужно сделать ресурсы доступными внутри WinFormsProject1. Для этого вам нужно отредактироватьWinFormsProject1.csproj в текстовом редакторе, поскольку некоторые свойства, которые необходимо установить, не отображаются в Visual Studio.

ОткройтеWinFormsProject1.csproj файл и добавьте следующее в ItemGroup:

<Compile Include="..\SharedProject\SharedResources.Designer.cs">
    <Link>SharedResources.Designer.cs</Link>
    <AutoGen>True</AutoGen>
    <DesignTime>True</DesignTime>
    <DependentUpon>SharedResources.resx</DependentUpon>
</Compile>
<EmbeddedResource Include="..\SharedProject\SharedResources.resx">
    <Link>SharedResources.resx</Link>
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
    <CustomToolNamespace>SharedProject</CustomToolNamespace>
    <LogicalName>SharedProject.SharedResources.resources</LogicalName>
</EmbeddedResource>

Ключевые вещи здесьCustomToolNamespace а такжеLogicalName, По умолчанию Visual Studio использует пространство имен проекта по умолчанию для именования ресурсов и создания файла * .Designer.cs. посколькуSharedProject а такжеWinFormsProject1 имеют разные пространства имен по умолчанию, поведение по умолчанию вызывает ресурс, который встроен вWinFormsProject1 быть несовместимым с файлом * .Designer.cs, который находится внутриSharedProject, Этого можно избежать, переопределив CustomToolNamespace и LogicalName.

Теперь сделайте то же самое дляWinFormsProject2.csproj, Вернитесь в Visual Studio. Он заметит, что вы изменили файлы csproj, и попросит перезагрузить проекты - выберите & quot; reload & quot ;. Вы должны найти, что теперь вы можете выбрать изображения изSharedResources.resx при разработке форм в обоихWinFormsProject1 а такжеWinFormsProject2.

По сути, все это делает VS включающимSharedResources.resx файл изSharedProject вWinFormsProject1 а такжеWinFormsProject2 проекты. Существует только один исходный файл .resx (вSharedProject), но при компиляции решения на самом деле будут три идентичных классаSharedProject.SharedResourcesпо одному в каждой из трех сборок, но, поскольку все они имеют внутреннюю видимость, они не будут мешать друг другу, даже если вы добавите ссылку между проектами.

 08 апр. 2011 г., 16:48
Я не знаю, как вам удалось это выяснить, но у меня это отлично сработало в VS 2010 !!!!!!
 05 окт. 2011 г., 07:01
В этом решении есть предостережение, вы должны помнить, что вы не зависите от «SharedResource». библиотека, но на самом деле компилировать эти ресурсы непосредственно в ваше приложение.
 05 окт. 2011 г., 07:03
Используя этот подход, если у вас есть приложение и 2 зависимые библиотеки, которым требуется доступ к SharedResources, то вы получите 3 копии ресурсов. Поэтому я думаю, что лучший способ взглянуть на этот ответ - это если вы хотите использовать SharedResources в качестве & quot; шаблона & quot; библиотека ресурсов, которые должны быть "включены"; в вашем приложении, по сравнению с SharedResource, от которого могут зависеть ваши проекты.

Ваш ответ на вопрос