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