c# - 在 NETStandard 类库中添加引用

标签 c# .net-standard

我正在努力了解 NETStandard 类库,以了解我正在处理的潜在 NuGet 包。然而,这是我第一次尝试使用 NuGet 和 NETStandard 包,所以我在某些方面有点迷茫,其中之一是引用系统库。

dynamic 类型是 System.Runtime.CompilerServices.DynamicAttribute 的一部分,但是,不存在对所述 DLL 的引用。我虽然我会继续添加它,但我似乎无法这样做。我想这不像框架类库那样工作?

如果我在我的解决方案资源管理器中右键单击我的 Dependencies 文件夹,然后单击 Add Reference...,我似乎找不到任何依赖项我可以用。不在 Assemblies 选项卡下,Assemblies 下没有任何内容 -> FrameworkExtensions

我只是想了解这实际上是如何工作的,为什么我找不到任何依赖项?

最佳答案

右键单击项目的依赖项节点 > 管理 Nuget 包 > 浏览并在搜索框中键入“动态”。选择 System.Dynamic.Runtime从列表顶部开始,现在您可以在源代码中使用 dynamic


如果您像我一样想知道为什么可以在方法代码中使用 dynamic 关键字而不引用 DLR 库,但不能在属性声明中使用,请继续阅读。

请查看以下 C# 代码行,这些代码使用 NETStandard.Library 进行编译没有任何问题,无需引用 System.Dynamic.Runtime。以下 C# 代码中第 1 行和第 3 行的主要区别在于关键字 dynamic vs var 的用法。或动态类型与静态类型。

Line 1: dynamic a = new {a = 1, b = 2};
Line 2: a = new Class1();
Line 3: var b = new { a = 1, b = 2 };

这里是同样三行的简化IL,供大家引用。

Line 1: newobj     instance void class '<>f__AnonymousType0`2'<int32,int32>::.ctor(!0,!1)
Line 2: newobj     instance void ClassLibrary2.Class1::.ctor()
Line 3: newobj     instance void class '<>f__AnonymousType0`2'<int32,int32>::.ctor(!0,!1)

如果比较生成的 IL 代码的第 1 行和第 3 行,您会发现根本没有区别。编译器可以推断出 type of the variable从初始化代码以及为不同类型启用相同变量的重新初始化。在这种情况下不需要依赖 DLR。

另一方面,当您将类的自动属性声明为dynamic 时,情况就完全不同了。

public class Class1 { public dynamic Test { get; set; } }

auto-property 的 IL 代码显示 dynamic 属性被转换为 object 类型的私有(private)支持字段,以及初始化代码、getter、和严重依赖 System.Runtime.CompilerServices.DynamicAttribute 的 setter在这种情况下,来自 System.Dynamic.Runtime 引入了对 DLR 的依赖。

关于c# - 在 NETStandard 类库中添加引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43744768/

相关文章:

asp.net-core - 构建 ASP.NET Core 项目以引用 .Net 标准库

c# - 用于单元测试 .net 标准库的框架/visual studio 项目类型?

.net - 如何在构建时正确动态更改 NuGet PackageId 和依赖项 PackageId?

.NET(标准、核心和框架): Developing Cross Platform Applications

c# - 为什么 Request.Form.ToString() 的返回值与 NameValueCollection.ToString() 的结果不同

c# - 第一次反序列化比后续反序列化花费的时间要长得多

c# - 使用 WPF 显示 map

c# - 如何列出 NuGet v3 API 中的所有本地包

c# - HtmlAgilityPack 选择的子节点不符合预期

xamarin - Android 项目引用的 netstandard 项目中未命中断点