在NETStandard类库中添加引用

时间:2017-05-02 18:25:46

标签: c# .net-standard

我试图了解NETStandard类库,找到我正在研究的潜在NuGet包。这是我第一次使用NuGet和NETStandard软件包,所以我在某些方面有点丢失,其中一个是引用系统库。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

如果您对我原因感兴趣的原因是为什么您可以使用dynamic关键字而不在方法的代码中引用DLR库,但不能在属性的声明中继续阅读。

请看下面的C#代码行,这些代码在没有引用System.Dynamic.Runtime的情况下使用NETStandard.Library进行编译时没有任何问题。以下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。

另一方面,当您将类的auto属性声明为dynamic时,会发生完全不同的事情。

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

自动属性的IL代码显示dynamic属性被转换为类型object的私有支持字段以及重新依赖的初始化,getter和setter的代码在System.Dynamic.Runtime的{​​{3}}上,在这种情况下将依赖关系引入DLR。