我正在努力了解 NETStandard 类库,以了解我正在处理的潜在 NuGet 包。然而,这是我第一次尝试使用 NuGet 和 NETStandard 包,所以我在某些方面有点迷茫,其中之一是引用系统库。
dynamic
类型是 System.Runtime.CompilerServices.DynamicAttribute
的一部分,但是,不存在对所述 DLL 的引用。我虽然我会继续添加它,但我似乎无法这样做。我想这不像框架类库那样工作?
如果我在我的解决方案资源管理器中右键单击我的 Dependencies
文件夹,然后单击 Add Reference...
,我似乎找不到任何依赖项我可以用。不在 Assemblies
选项卡下,Assemblies
下没有任何内容 -> Framework
或 Extensions
。
我只是想了解这实际上是如何工作的,为什么我找不到任何依赖项?
最佳答案
右键单击项目的依赖项节点 > 管理 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/