291

我正在尝试在 Microsoft Visual C# 2010 中编译此代码

using System;
using System.Globalization;


class main
{
    static void Main()
    {

        dynamic d;
        d = "dyna";
        Console.WriteLine(d);    
    }
}

但我收到这两个错误

错误 1 ​​未定义或导入预定义类型“Microsoft.CSharp.RuntimeBinder.Binder”

错误 2 找不到编译动态表达式所需的一种或多种类型。您是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?

我读了另一篇文章,但我是 C# 的新手,我不明白真正的问题是什么。特别是这些所谓的.config文件是什么以及在哪里..

4

8 回答 8

593

在您的解决方案资源管理器窗口中,右键单击引用,选择添加引用,转到 .NET 选项卡,找到并添加 Microsoft.CSharp。

或者,添加Microsoft.CSharp NuGet 包。

Install-Package Microsoft.CSharp
于 2012-07-30T16:26:25.370 回答
21

确保您的项目面向 .NET Framework 4.0。Visual Studio 2010 也支持 .NET 3.5 框架目标,但 .NET 3.5 不支持该dynamic关键字。

您可以在项目属性中调整框架版本。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb398202.aspx

于 2012-07-30T16:26:34.160 回答
7

我遇到了同样的问题,除了删除和添加引用没有修复错误,所以我将 .Net 版本从 更改4.54.5.1.

为此,请转到您的web.config文件并更改以下行

<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />

对此

<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />

并重建。

于 2014-10-22T15:42:08.887 回答
6

ViewBag 下的红线让我头疼了 3 个月)。只需从项目中删除 Microsoft.CSharp 引用,然后再次添加它。

于 2014-04-29T13:15:42.717 回答
1

我遇到了同样的问题,并通过从项目中删除“Microsoft.CSharp”引用来解决它,然后再次添加它。

于 2014-08-21T06:32:20.893 回答
1

对我来说,删除并重新添加对 Microsoft.CSharp 的引用暂时解决了问题,直到编辑了受影响的文件。关闭 Visual Studio 并重新打开项目可以更长期地修复它,因此如果在已引用 Microsoft.CSharp 时发生这种情况,这是一个选项。

也许第一步重新启动 IDE 似乎微不足道,但这里提醒像我这样不认为这是第一件事的人。

于 2016-07-08T08:45:01.657 回答
0

这些都不适合我。

我的类库肯定都引用了 System.Core 和 Microsoft.CSharp。Web 应用程序是 4.0,由于支持问题无法升级到 4.5。

我在使用Razor Engine编译剃须刀模板时遇到错误,并且只是间歇性地遇到它,例如在重新启动 Web 应用程序之后。

对我有用的解决方案是手动加载程序集,然后重新尝试相同的操作......

        bool retry = true;
        while (retry)
        {
            try
            {
                string textTemplate = File.ReadAllText(templatePath);
                Razor.CompileWithAnonymous(textTemplate, templateFileName);
                retry = false;
            }
            catch (TemplateCompilationException ex)
            {
                LogTemplateException(templatePath, ex);
                retry = false;

                if (ex.Errors.Any(e  => e.ErrorNumber == "CS1969"))
                {
                    try
                    {
                        _logger.InfoFormat("Attempting to manually load the Microsoft.CSharp.RuntimeBinder.Binder");
                        Assembly csharp = Assembly.Load("Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
                        Type type = csharp.GetType("Microsoft.CSharp.RuntimeBinder.Binder");
                        retry = true;
                    }
                    catch(Exception exLoad)
                    {
                        _logger.Error("Failed to manually load runtime binder", exLoad);
                    }
                }

                if (!retry)
                    throw;
            }
        }

希望这可以帮助其他人。

于 2015-07-07T00:25:44.367 回答
-2

如果错过,Microsoft.CSharp.dll 可能会出现此错误。检查您的项目参考。

于 2015-06-23T12:58:55.037 回答