因为项目原因,还使用着比较原始的.NET Framework
框架,但因为某种原因,暂时不让升级到.NET 6。为了能够解锁更多Visual Studio 2022
的功能,尝试手动修改csproj
文件。
这个过程中,也会遇到不少坑,再次做个记录。
一、类库中包含了 App.xaml
错误输出:
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2302,5): warning MSB3270: 所生成项目的处理器架构“MSIL”与引用“D:\work\project\xxx\Utils\xxx\\..\..\Debug\xxx.dll”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改您的项目的目标处理器架构,以使您的项目与引用间的处理器架构保持一致,或者为引用关联一个与您的项目的目标处理器架构相符的处理器架构。 1>C:\Program Files\dotnet\sdk\6.0.301\Sdks\Microsoft.NET.Sdk.WindowsDesktop\targets\Microsoft.WinFX.targets(223,9): error MC1002: 库项目文件无法指定 ApplicationDefinition 元素。 1>C:\Program Files\dotnet\sdk\6.0.301\Sdks\Microsoft.NET.Sdk.WindowsDesktop\targets\Microsoft.WinFX.targets(223,9): error BG1003: 项目文件包含无效的属性值。解决方法:
删除类库中的 App.xaml,因为`Microsoft.NET.Sdk`中已经包含了对它编译方式的定义。二、AssemblyAttribute 提示重复
因为 Microsoft.NET.Sdk
中已经包含了对它的定义,我们只需要在csproj
中,将自动生成AssemblyInfo
文件关闭。
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
三、生成事件批处理报错
事件编译,新旧不一样,需要修改。把bat批处理复制到IDE里面自动生成即可
旧的csproj
形式
<PropertyGroup>
<PreBuildEvent>if "$(PlatformName)" == "x64" (xcopy /E /Y "$(ProjectDir)libs\x64\*.*" "$(ProjectDir)libs\") else (xcopy /E /Y "$(ProjectDir)libs\x86\*.*" "$(ProjectDir)libs\")</PreBuildEvent>
</PropertyGroup>
新的csproj
方式
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="if "$(PlatformName)" == "x64" (xcopy /E /Y "$(ProjectDir)libs\x64\*.*" "$(ProjectDir)libs\") else (xcopy /E /Y "$(ProjectDir)libs\x86\*.*" "$(ProjectDir)libs\")" />
</Target>
主意看两端批处理的表示方式,可以很明显的看出来,相关的配置已经完全不一样了。
四、命令行无法构建x64的原因
错误提示
...省略... project.assets.json 没有 net452/win7-x64 的目标 ...省略... 可能需要在项目 RuntimeIdentifiers 中包括 “win7-x64”.这个错误的主要原因是因为nuget包还原的时候,默认是按 win7-x86
来还原的。我们可以在project.assets.json
文件里面找到这个配置项。要解决这个问题,我们就需要在还原nuget
包的时候,告诉编译器我们是按win7-x64
来做编译。
具体如下:
dotnet restore -r win7-x64
五、.NET Framework v4.5.2 基于netstandar无法编译通过
netstandar 不支持.net framework v4.5.2,升级到.net framework v4.6.1 以上即可。
六、动态库的引用差异
- .NET6中不需要额外引用
System.Web.dll
,直接Using System.Web
的命名空间即可 System.Windows.Form.MenuItem
使用ToolStripMenuItem
代替System.Windows.Interactivity.dll
使用System.Windows.Interactivity.WPF
nuget包代替System.Drawing.dll
使用System.Drawing.Common
nuget包代替NotifyIcon.ContextMenu
使用NotifyIcon.ContextMenuStrip
代替ContextMenu
使用ContextMenuStrip
代替
关于手动升级到新版的csproj
文件格式,网上有较多教程,我这边就不列出来了。
主要有两种方式:
- 通过工具升级
- 手动修改
csproj
文件
本博客会持续更新~
本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/NET-%E6%89%8B%E5%8A%A8%E5%8D%87%E7%BA%A7csproj.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。