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


287

我正在尝试在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文件在什么地方。


25
检查您的参考。右键单击并单击“添加引用”。搜索“ Microsoft.CSharp.dll”并添加它。通常,当您创建新项目时,System.Core.dll是标准配置,对CSharp.dll不太确定
Internet互联网

Answers:


586

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


26
我的已被引用,但我仍然遇到此错误。我在VS 2010中创建了一个新的ASP.Net MVC4应用程序。被卡住,删除并重新读取它,错误消失了。清洁/重建无济于事。
Paul

@Paul:将项目从4.0升级到4.5后,我也遇到了同样的情况。版本号/ etc在4.0 / 4.5 IIRC之间是相同的,这可能是原因。
史蒂文·埃弗斯

13
Visual Studio团队应该真正考虑让人们将鼠标悬停在错误上,然后选择“将Microsoft.CSharp添加到引用”
geoyws,2014年

8
@Geoyws一个字:ReSharper。
user2864740 2015年

2
@ user2864740通常,Reshaper会执行此操作。但是在这种情况下,ReSharper不会显示任何内容。
Pulle


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" />

并重建。


6

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


3
即使我的ViewBag行中也有红线,这对我也不起作用
knocte 2015年

1

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


1

对我来说,删除并重新添加对Microsoft.CSharp的引用可以暂时解决问题,直到受影响的文件被编辑为止。关闭Visual Studio并重新打开该项目会对其进行更长期的修复,因此,如果在已引用Microsoft.CSharp的情况下发生这种情况,则可以使用此选项。

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


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;
            }
        }

希望这可以帮助其他人。


-2

如果您错过了Microsoft.CSharp.dll,则可能发生此错误。检查您的项目参考。


3
欢迎使用Stack Overflow!您可能要包括一个代码示例或更多解释。这似乎更像是一条评论,
Gary Storey

5
您基本上说的话与3年前给出的答案相同。
Ilya Luzyanin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.