在NETStandard类库中添加引用

Det*_*ium 6 c# .net-standard

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

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

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

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

Eug*_*nko 5

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


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

看看下面的C#代码行,它们在没有引用的情况下使用NETStandard.Library进行编译时没有任何问题System.Dynamic.Runtime.下面C#代码中第1行和第3行之间的主要区别是关键字dynamic vs var或dynamic vs static typing 的用法.

Line 1: dynamic a = new {a = 1, b = 2};
Line 2: a = new Class1();
Line 3: var b = new { a = 1, b = 2 };
Run Code Online (Sandbox Code Playgroud)

以下是相同三行的简化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)
Run Code Online (Sandbox Code Playgroud)

如果比较生成的IL代码的第1行和第3行,您将发现没有任何区别.编译器可以从初始化代码推断变量类型,并为不同类型启用相同变量的重新初始化.此方案中不需要依赖DLR.

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

public class Class1 { public dynamic Test { get; set; } }
Run Code Online (Sandbox Code Playgroud)

自动属性的IL代码揭示dynamic属性被转换为所述类型的私人支持字段object以及初始化,吸气剂的代码,并且设置器,其在很大程度上依赖于System.Runtime.CompilerServices.DynamicAttributeSystem.Dynamic.Runtime使在依赖关系在这种情况下DLR.