.NET Core 应用程序针对 .NET Standard 1.6,如何使用动态引用?

43

我正在尝试在一个以C# .net core为目标的应用程序中使用一个dynamic变量,该应用程序针对.net standard 1.6。(平台?库?框架?元框架?) 我最初在一个真实的应用程序中遇到了这个问题,但我已经将其简化为一个最小的复现。

project.json

{
    "version": "1.0.0-*",
    "buildOptions": { "emitEntryPoint": true },
    "dependencies": { "NETStandard.Library": "1.6.0" },
    "frameworks": {
        "netstandard1.6": { "imports": "dnxcore50" }
    },
    "runtimes": { "win10-x64": {} }
}

程序.cs

using System;

public class Program {
    public static void Main(string[] args) {
        dynamic hello = "hello world";
        Console.WriteLine(hello);
    }
}
当我尝试构建这个时,Console.WriteLine(hello);出现构建错误,指出:

CS0656 缺少必需的编译器成员'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

在面向netstandard 1.6的应用程序中是否可能使用dynamic变量?如何做到?


如果有帮助的话,针对 netcoreapp1.0(也支持 netstandard 1.6)来进行目标定位可以修复该错误。这很奇怪。 - krontogiannis
3个回答

64

3
我最终不得不添加以下依赖项和版本才能成功构建和运行:"System.Dynamic.Runtime": "4.0.11","Microsoft.CSharp": "4.0.1","Microsoft.NETCore.Runtime.CoreCLR": "1.0.4"。现在它可以成功构建和运行了。 - recursive
7
Microsoft.CSharp 依赖于 System.Dynamic.Runtime,因此您无需添加两个。 - svick
3
我同意。我也必须添加这三个。也许这与它是一个 .NET Standard 项目有关? - Brent Rittenhouse

32

右键单击项目 > 管理 NuGet 包... > 添加以下两个突出显示的软件包: 在此输入图片描述


这解决了我的问题。我正在运行 .net core 2.1(或 2.2...同样的问题)。我只需要添加 Microsoft.CSharp。 - ebol2000

7
如果您正在编写应用程序而不是库,应使用Microsoft.NETCore.App,而不是NETStandard.Librarynetcoreapp1.0而不是netstandard1.6。这样做将解决您的问题。
如果您想在库中使用dynamic(或不依赖于Microsoft.NETCore.App的应用程序),则需要将Microsoft.CSharp添加为依赖项。

有没有权威的参考资料,可以说明应该为哪些目的使用哪些“框架”?我一直在寻找关于这一切意义的信息,但我发现的都是矛盾的博客和类似的东西。你的信息来源是什么? - recursive
首先,这是由 dotnet new -t consoledotnet new -t lib 生成的 project.json。更多解释请参见 .Net 文档中的 Packages, Metapackages and Frameworks,特别是 基于包的框架部分 - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接