如何使用WPF控件多目标库项目

时间:2018-04-05 17:08:27

标签: c# wpf csproj multitargeting multi-targeting

我有一个需要以.NET 3.5和.NET 4.0为目标的类库项目,现在它的工作方式是为每个目标框架创建单独项目并将每个项目中的文件链接到同一源的典型方法。

我想利用.NET Core项目中出现的新csproj格式,因为使用新的csproj格式,多目标定位更加简单。

我创建了一个新的类库(.NET Core)项目,并开始尝试移植我现有的库。

我真的不需要定位.netcoreapp2.0,所以我的目标框架看起来像这样

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

我有以下代码块来帮助使用新的csproj格式.NET 3.5 oddities

<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 个答案:

答案 0 :(得分:1)

某些WPF项目从.NET 4.0开始迁移到新库System.Xaml

仅在构建.NET 4.0目标时抛出错误The name 'InitializeComponent' does not exist in the current context

要解决此问题,需要将以下块添加到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文件,因此找到了一个解决方法here,它添加了以下块来构建xaml页面但仍显示在解决方案资源管理器中。

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

<ItemGroup>
  <None Include="@(Page)" />
</ItemGroup>