解决Visual Studio报错 NETSDK1152: 找到了多个具有相同相对路径的发布输出文件
原因:
是项目多层引用(a引用了b、c,d引用了a、b、c),且被引用的项目生成了xml文件,发布时导致xml文件重复 ,但.net 6.0下会触发报错。
解决:
- 被引用项目不要生成xml文件【根本原因】;
- 发布时,将C:\Program Files\dotnet\sdk\6.x的sdk移出C:\Program Files\dotnet目录;
- 将C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.ConflictResolution.targets下<NETSdkError Condition="'$(_ResolvedFileToPublishContainsDuplicates)' == 'true'"设为false;
- 在需要发布项目的csproj里新增false;
4种均可。
托管代码和非托管代码
托管代码
托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行。编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。随着程序集的运行,CLR提供各种服务:内存管理,安全管理,线程管理,垃圾回收,类型检查等等。
非托管代码
非托管代码,直接编译成目标计算机码,在公共语言运行库环境的外部,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。如需要内存管理等服务,必须显示调用操作系统的接口,通常调用Windows SDK所提供的API来实现内存管理。
区别
1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。
2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。