Как настроить таргетинг на библиотечный проект с помощью элементов управления WPF

У меня есть проект библиотеки классов, который должен быть нацелен на.NET 3.5 и.NET 4.0, и способ, которым это делается сейчас, является типичным способом создания отдельных проектов для целевой структуры и связывания файлов в каждом проекте с одним и тем же источником.

Я хотел бы воспользоваться новым форматом csproj, который появился в проектах.NET Core, потому что с новым форматом csproj многоцелевой таргетинг стал намного проще.

Я создал новый проект библиотеки классов (.NET Core) и начал пытаться портировать свою существующую библиотеку.

Мне не нужно нацеливаться на.netcoreapp2.0, поэтому мои целевые фреймворки выглядят так

<PropertyGroup>
  <TargetFrameworks>net35;net40</TargetFrameworks>
</PropertyGroup>

и у меня есть следующий блок кода, чтобы помочь с причудами.NET 3.5 с новым форматом csproj.

<PropertyGroup>
  <FrameworkPathOverride Condition="'$(TargetFramework)' == 'net35'">C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client</FrameworkPathOverride>
</PropertyGroup>

Все идет нормально. Все началось с того, что в моей библиотеке классов есть элементы управления WPF. Я получаю ошибки компиляции, потому что не могу найти System.Windows и другие предметы, связанные с WPF.

Я обнаружил, что могу добавить ссылки на другие сборки Windows, поэтому добавил следующее

<ItemGroup>
  <Reference Include="PresentationFramework" />
  <Reference Include="PresentationCore" />
  <Reference Include="WindowsBase" />
</ItemGroup>

Это избавило от большинства моих ошибок, но теперь я получаю такие ошибки, как The name 'InitializeComponent' does not exist in the current context

1 ответ

Решение

Некоторые элементы WPF перенесены в новую библиотеку System.Xaml начиная с.NET 4.0

Ошибка The name 'InitializeComponent' does not exist in the current context выбрасывается только при создании цели.NET 4.0.

Чтобы это исправить, необходимо добавить следующий блок в файл csproj

<ItemGroup Condition="'$(TargetFramework)'=='net40'">
  <Reference Include="System.Xaml" />
</ItemGroup>

Кроме того, страницы xaml должны быть построены как страницы, поэтому в файл csproj также необходимо добавить следующее

Все файлы xaml, которые нужно скомпилировать как страницу.

<ItemGroup>
  ...
  <Page Include="Path\to\SomeWindow.xaml" />
  <Page Include="Path\to\SomeOtherWindow.xaml" />
  ...
</ItemGroup>

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

<ItemGroup>
  <Page Update="@(Page)" SubType="Designer" Generator="MSBuild:Compile" />
</ItemGroup>

<ItemGroup>
  <None Include="@(Page)" />
</ItemGroup>
Другие вопросы по тегам