【问题标题】:Adding references in NETStandard class library在 NETStandard 类库中添加引用
【发布时间】:2017-09-30 09:12:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我正在使用动态与 .net 标准 1.6 库,没有任何额外的参考...
  • 您使用的是什么版本的 Visual Studio 和/或 C# 编译器?
  • @EugeneKomisarenko 这是VS 2017,如何找到编译器版本?
  • @Hans Passant VS 2017 和 NETStandard 类库 1.6 很容易重现该问题。方法主体中的动态类型编译得很好,但是一旦将它用作属性类型,就会得到相同的编译错误。请参阅下面有关如何修复它的答案。
  • 啊,.NET 标准,不是 .NETCore。很抱歉弄乱了你的答案。

标签: c# .net-standard


【解决方案1】:

右键单击项目的依赖项节点 > 管理 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 的依赖。

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

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

自动属性的 IL 代码显示 dynamic 属性被转换为 object 类型的私有支持字段,以及严重依赖 @987654324 的初始化、getter 和 setter 的代码@ from System.Dynamic.Runtime 在这种情况下将依赖项引入 DLR。

【讨论】:

  • 非常简洁的答案,但是在我写这个 SO 的时候,我在 NuGet 管理器中找不到任何东西。甚至没有动态。也许我应该再检查一次?今天晚些时候再做。
  • 确保在 NuGet 未安装或更新中切换到浏览选项卡...有时会令人困惑。
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多