前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >针对不同的运行时验证包

针对不同的运行时验证包

作者头像
用户4268038
发布于 2022-01-09 04:12:53
发布于 2022-01-09 04:12:53
6480
举报
文章被收录于专栏:stcnbstcnb

可为 NuGet 包中的不同运行时选择不同的实现程序集。 在这种情况下,需要确保这些程序集彼此兼容并与编译时程序集兼容。

例如,考虑以下情况。 你正在开发一个库,该库涉及分别对 UnixWindows API 的一些互操作调用。 你已经编写了以下代码:

#if Unix

public static void Open(string path, bool securityDescriptor)

{

// call unix specific stuff

}

#else

public static void Open(string path)

{

// call windows specific stuff

}

#endif

生成的包结构如下所示。

lib/net6.0/A.dll

runtimes/unix/lib/net6.0/A.dll

无论基础操作系统是哪种,都请在编译时使用 lib\net6.0\A.dll。 对于非 Unix 系统,也将在运行时使用 lib\net6.0\A.dll。 但是,对于 Unix 系统,将在运行时使用 runtimes\unix\lib\net6.0\A.dll。

当你尝试打包此项目时,会遇到以下错误:

D:\demo>dotnet pack

Microsoft (R) Build Engine version 17.0.0-preview-21460-01+8f208e609 for .NET

Copyright (C) Microsoft Corporation. All rights reserved.

Determining projects to restore...

All projects are up-to-date for restore.

You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview

PackageValidationThrough -> D:\demo\bin\Debug\net6.0\PackageValidationThrough.dll

Successfully created package 'D:\demo\bin\Debug\PackageValidationThrough.1.0.0.nupkg'.

C:\Program Files\dotnet\sdk\6.0.100-rc.1.21463.6\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(32,5): error CP0002: Member 'A.B.Open(string)' exists on lib/net6.0/PackageValidationThrough.dll but not on runtimes/unix/lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]

C:\Program Files\dotnet\sdk\6.0.100-rc.1.21463.6\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(32,5): error CP0002: Member 'A.B.Open(string, bool)' exists on runtimes/unix/lib/net6.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]

你发现了错误并将 A.B.Open(string) 添加到 Unix 运行时。

#if Unix

public static void Open(string path, bool securityDescriptor)

{

// call unix specific stuff

}

public static void Open(string path)

{

throw new PlatformNotSupportedException();

}

#else

public static void Open(string path)

{

// call windows specific stuff

}

public static void Open(string path, bool securityDescriptor)

{

throw new PlatformNotSupportedException();

}

#endif

你尝试再次打包该项目,然后就成功了。

通过在项目文件中设置 EnableStrictModeForCompatibleTfms 属性为此验证程序启用“严格模式”。 启用严格模式后,将更改一些规则,并在存在差异时执行一些其他规则。 如果希望所比较的双方在领域和标识方面完全相同,这十分有用。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
dotnet 根据基线包版本实现库版本兼容
本文来告诉大家如何根据 基线包版本 的功能来实现自动在构建过程中,告诉开发者,当前版本是否存在不兼容旧版本的变更。其不兼容变更包括二进制中断变更和 API 不兼容变更和源代码中断变更。可以让库开发者花更少的精力在测试兼容性上
林德熙
2021/12/08
6580
包验证概述
跨平台兼容性已成为 .NET 库作者的主流要求。 但是,如果没有针对这些包的验证工具,它们通常就不能正常工作。 这对于新兴平台来说尤其成问题,因为这些平台的使用率不够高,难以引起库作者的特别关注。
用户4268038
2022/01/09
4260
.NET 6新新东西--nuget包验证
有时候我们在开发中需要将类库打包成nuget包供其他项目使用。这种看似很很好,那么如果类库修改了,即使代码可以运行并成功打包出了新版本,这虽然看起来一切正常,但我们没办法确保这次的修改是安全的也是兼容旧版本的。微软也意识到了这一点,因此就在.Net6中提供了包验证工具,帮我们检测包的安全性和兼容性。下面我们就来看一下怎么使用: 其实使用方式非常简单,只需在项目文件中加入```EnablePackageValidation``属性即可:
喵叔
2021/12/08
3440
我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!
早在2001年,我用C#为学校的一门300系列的操作系统课程编写了一个微型虚拟操作系统,后来在2002年将其移植到了VB.NET。这些都是在.NET Core出现之前的代码,基于Windows早期的.NET 1.1或2.0。
郑子铭
2022/04/19
6410
我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!
根据基线包版本进行验证
包验证可帮助你根据之前发布的稳定版包来验证库项目。 若要启用包验证,请将 PackageValidationBaselineVersion 或 PackageValidationBaselinePath 属性添加到项目文件。
用户4268038
2022/01/09
3510
验证兼容的框架
包含兼容框架的包需要确保针对某个框架编译的代码可以针对另一个框架运行。 兼容框架对的示例包括:
用户4268038
2022/01/09
5950
ASP.NET Core使用记录3
原因: 是项目多层引用(a引用了b、c,d引用了a、b、c),且被引用的项目生成了xml文件,发布时导致xml文件重复 ,但.net 6.0下会触发报错。 解决:
Echo_Wish
2023/11/30
2170
dotnet 修复 ILLinkTasksAssembly 特性的值的计算结果无效
在加上 IL Link 的项目里面,在升级到 .NET 6 预览版,有一些项目将会构建不通过,或者有些 C++ CLI 项目加载失败。提示 元素 UsingTask 中“AssemblyFile”特性的值“$(ILLinkTasksAssembly)”的计算结果“”无效。原因就是 .NET 6 预览版里面,或者自己的设备上 ILLinkTasksAssembly 属性定义失效
林德熙
2021/04/08
9340
C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6
.NET6 正式版本已经发布有一阵子了,今天我就体验一下如何将.NET Framework的项目升级为.NET 6.
用户9127601
2022/04/19
3.2K0
C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6
dotnet 修复多框架 TargetFrameworks 包含不受支持平台导致构建失败
本文将告诉大家如何修复 dotnet 项目里的多框架 TargetFrameworks 如果包含了当前系统无法支持的平台时,如何进行跳过。解决在 Linux 平台构建时提示 Mac Catalyst 不受支持而构建失败
林德熙
2024/04/01
3240
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
2018-06-20 01:22
walterlv
2018/09/18
1.1K0
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台
我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则必须将目标平台设置为 Windows 平台。但是我不想让此项目绑定到 Windows 平台上,不在 TargetFramework 上修改为 net6.0-windows 框架
林德熙
2021/11/22
1.2K0
如何让 .NET 程序脱离系统安装的 .NET 运行时独立运行?除了 Self-Contained 之外还有更好方法!谈 dotnetCampus.AppHost 的工作原理
从 .NET Core 3 开始,.NET 应用就支持独立部署自己的 .NET 运行时。可以不受系统全局安装的 .NET 运行时影响,特别适合国内这种爱优化精简系统的情况……鬼知道哪天就被优化精简了一个什么重要 .NET 运行时组件呢!然而,如果你的项目会生成多个 exe 程序,那么他们每个独立发布时,互相之间的运行时根本不互通。即便编译时使用完全相同的 .NET 框架(例如都设为 net6.0),最终也无法共用运行时文件。
walterlv
2023/10/23
8510
如何让 .NET 程序脱离系统安装的 .NET 运行时独立运行?除了 Self-Contained 之外还有更好方法!谈 dotnetCampus.AppHost 的工作原理
在linux下使用OOxml Validator校验Office文档
由于某些原因,需要在linux下验证Office文档的正确性,所以进行了一些校验工具的调研,vscode上有OOxml Validator插件,本质也是调用的微软的Document.OpenXml SDK, 在windows上有微软提供的安装程序安装运行,可以去官网下载,linux以及macos上暂时没发现有相应的工具可以使用,好在macos和linux上都有dotnet的支持,为linux上实现调用C#库提供了条件
ranky
2022/01/24
1.6K0
【Blog.Core开源】快速升级.NET 6.0
《Blog.Core》开源项目已经3年,期间收获了很多很多,同时也收到了很多小伙伴的支持和鼓励,才使得我有足够的心力从2.0到2.1、2.2、3.0、3.1和稳定了一年的5.0主版本。当然不会停止脚步的,在7月14号微软官方发布第六个6.0版本之际,老张决定是时候升级一波了,目前已经升级完成,并单独建立分支,主版本还是5.0,等官方正式发布后,我再合并到主分支。
老张的哲学
2022/04/11
6020
【Blog.Core开源】快速升级.NET 6.0
C#/.NET 如何创建带有本机依赖的多框架多系统 NuGet 包
正常如果你想写一个 .NET 的 NuGet 包,直接打包就好了,你的引用程序集会出现在 NuGet 包内的 lib 文件夹内。然而,如果我们的 NuGet 包包含本机依赖的话怎么办呢?
walterlv
2023/10/23
9050
C#/.NET 如何创建带有本机依赖的多框架多系统 NuGet 包
【翻译】.NET 5 Preview8发布
今天,.NET 5预览8发布了,对于.NET5.0的功能开发已经完成了,这必须要排除待处理的bug,预览8是最后一次预览版本。预计11月正式的.NET5.0版本发布之前还将发布两个正式之前的候选版本,这篇文章描述了.NET5.0版本中的一系列功能。 You can download .NET 5.0, for Windows, macOS, and Linux:
Jlion
2022/04/07
8140
【翻译】.NET 5 Preview8发布
.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
我们有多种工具可以将程序集合并成为一个。打包成一个程序集可以避免分发程序的时候带上一堆依赖而出问题。
walterlv
2023/10/22
3K0
.NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
使用.NET Core+Docker 开发微服务
.NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜,目标是开发一个微服务,然后部署到Docker swarm集群,供其他应用调用。
JadePeng
2018/09/27
3.3K0
使用.NET Core+Docker 开发微服务
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
发布于 2018-01-15 16:04 更新于 2018-09-07 04:40
walterlv
2018/09/18
1.5K0
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
推荐阅读
相关推荐
dotnet 根据基线包版本实现库版本兼容
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文