Как сделать проект библиотеки многоцелевым с помощью элементов управления 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


person TJ Rockefeller    schedule 05.04.2018    source источник
comment
Вы запустили проект .NET Core для .NET Framework 4.0? Это бессмысленно. Кроме того, WPF не существует в .NET Core, поэтому в этом еще меньше смысла.   -  person Camilo Terevinto    schedule 05.04.2018
comment
@CamiloTerevinto Есть ли другой тип проекта, который использует преимущества нового формата файла csproj, который позволяет вам легко использовать несколько целей, используя один проект? Если да, то я бы использовал это.   -  person TJ Rockefeller    schedule 05.04.2018


Ответы (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, которые необходимо скомпилировать как page.

<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>
person TJ Rockefeller    schedule 05.04.2018