TJ *_*ler 5 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>
Run Code Online (Sandbox Code Playgroud)
我有以下代码块来帮助解决.NET 3.5中新的 csproj 格式的奇怪问题。
<PropertyGroup>
<FrameworkPathOverride Condition="'$(TargetFramework)' == 'net35'">C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client</FrameworkPathOverride>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。事情开始走下坡路的是我的类库有 WPF 控件。我收到编译错误,因为它找不到System.Windows其他 WPF 相关项目。
我发现我可以添加对其他 Windows 程序集的引用,因此我添加了以下内容
<ItemGroup>
<Reference Include="PresentationFramework" />
<Reference Include="PresentationCore" />
<Reference Include="WindowsBase" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
这消除了我的大部分错误,但现在我遇到了类似的错误The name 'InitializeComponent' does not exist in the current context
System.Xaml从 .NET 4.0 开始,一些 WPF 项目已迁移到新库
The name 'InitializeComponent' does not exist in the current context仅当构建 .NET 4.0 目标时才会引发该错误。
要解决此问题,需要将以下块添加到 csproj 文件中
<ItemGroup Condition="'$(TargetFramework)'=='net40'">
<Reference Include="System.Xaml" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
另外,xaml页面需要构建为页面,因此还需要将以下内容添加到csproj文件中
所有需要编译为页面的 xaml 文件。
<ItemGroup>
...
<Page Include="Path\to\SomeWindow.xaml" />
<Page Include="Path\to\SomeOtherWindow.xaml" />
...
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
这将从解决方案资源管理器中删除 xaml 文件,因此在这里找到了一种解决方法,添加以下块来构建 xaml 页面,但仍显示在解决方案资源管理器中。
<ItemGroup>
...
<Page Include="Path\to\SomeWindow.xaml" />
<Page Include="Path\to\SomeOtherWindow.xaml" />
...
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)