Я недавно столкнулся с той же проблемой. Посмотрел документацию MS, но не смог найти хороших решений. В конце концов мне удалось заставить редактор изображений в конструкторе WinForms распознавать файлы ресурсов из других проектов, используя метод, описанный ниже. Это хакерство - если у кого-то есть более чистое решение, которым он хочет поделиться, пожалуйста, напишите. Я проверял это только на VS 2008.
Прежде чем начать, я должен сказать, что если вы просто хотите сделать элементы в файле Resources.resx доступными для других проектов, вы можете просто отредактировать его свойства и установить для общего доступа модификатор доступа для сгенерированного класса, чтобы он использовал PublicResXFileCodeGenerator , Приведенная ниже гимнастика необходима только в том случае, если вы хотите, чтобы дизайнеры WinForms брали изображения внутри этого файла ресурсов, как описано в посте выше от Дугласа.
Скажите, что ваше решение имеет следующий макет. Здесь важно пространство имен по умолчанию для различных проектов (щелкните правой кнопкой мыши узел проекта в обозревателе решений -> Свойства -> вкладка «Приложение»), поэтому я поместил его в квадратные скобки после имен проектов.
- MySolution
- SharedProject (пространство имен по умолчанию = SharedProject)
- WinFormsProject1 (пространство имен по умолчанию = WinFormsProject1)
- WinFormsProject2 (пространство имен по умолчанию = WinFormsProject2)
Вы хотите создать файл ресурсов в SharedProject , содержащий изображения, которые могут использоваться WinFormsProject1 и WinFormsProject2 .
Сначала создайте новый файл ресурсов в корне SharedProject , назовем его SharedResources.resx . Важно, чтобы этот файл использовал ResXFileCodeGenerator, а не PublicResXFileCodeGenerator, по причинам, которые станут понятны позже.
Редактируйте SharedResources.resx в Visual Studio и добавьте ресурсы изображений, которыми вы хотите поделиться. Visual Studio также должна сгенерировать для вас файл класса внутри SharedProject с именем SharedResources.designer.cs .
Ваше решение должно выглядеть следующим образом:
- MySolution
- SharedProject (пространство имен по умолчанию = SharedProject)
- SharedProject.csproj
- SharedResources.resx
- SharedResources.Designer.cs
- WinFormsProject1 (пространство имен по умолчанию = WinFormsProject1)
- WinFormsProject2 (пространство имен по умолчанию = WinFormsProject2)
Если вы откроете 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 и попросит перезагрузить проекты - выберите «перезагрузить». Вы должны обнаружить, что теперь вы можете выбирать изображения из SharedResources.resx при проектировании форм в WinFormsProject1 и WinFormsProject2 .
По сути, все это делает VS включающим файл SharedResources.resx из SharedProject в WinFormsProject1 и WinFormsProject2, Существует только один исходный файл .resx (в SharedProject ), но при компиляции решения на самом деле будет три идентичных класса с именем SharedProject.SharedResources , по одному в каждой из трех сборок. , но так как все имеют внутреннюю видимость, они не будут мешать друг другу, даже если вы добавите ссылку между проектами.