C# 为什么';t dynamic关键字是否可以处理动态加载的程序集?

C# 为什么';t dynamic关键字是否可以处理动态加载的程序集?,c#,dynamic-keyword,dynamic-assemblies,C#,Dynamic Keyword,Dynamic Assemblies,我正在开发一个CSharp表达式计算器,您可以在下面看到它。该组件生成代码并在内存中编译,然后加载生成的程序集,创建生成类的实例并运行它。结果保存在字典中 我的问题是,在最后一行代码失败之前,所有代码都运行正常,但出现以下异常: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException“对象”不包含“FirstName”的定义 但是,Visual Studio能够向我展示专业变量内容: Professional = { FirstName = J

我正在开发一个CSharp表达式计算器,您可以在下面看到它。该组件生成代码并在内存中编译,然后加载生成的程序集,创建生成类的实例并运行它。结果保存在字典中

我的问题是,在最后一行代码失败之前,所有代码都运行正常,但出现以下异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException“对象”不包含“FirstName”的定义

但是,Visual Studio能够向我展示专业变量内容:

Professional = { FirstName = Juan Pablo, 
                LastName = Ibañez, 
                Certifications = <>f__AnonymousType0`3[System.String,System.String,System.String][], 
                SayHi = System.Action }
Professional={FirstName=Juan Pablo,
LastName=Ibañez,
Certifications=f__AnonymousType0`3[System.String,System.String,System.String][],
SayHi=System.Action}
这是代码:

    static void Main(string[] args)
    {
        const string data = @"results[""professional""] = 
        new
        {
            FirstName = ""Juan Pablo"",
            LastName = ""Ibañez"",
            Certifications = new[]
            {
                new { Provider=""MSFT"", ExamCode = ""70-536"", Title = ""TS: Microsoft .NET Framework – Application Development Foundation"" },
                new { Provider=""MSFT"", ExamCode = ""70-505"", Title = ""TS: Microsoft .NET Framework – Application Development Foundation"" },
                new { Provider=""MSFT"", ExamCode = ""70-563"", Title = ""TS: Microsoft .NET Framework – Application Development Foundation"" }
            },

            SayHi = new System.Action(()=> System.Console.WriteLine(""Hi""))
        };";

        var eval = CSharpEvaluator.Evaluate(data); // return a disctionary<string, object>
        dynamic professional = eval["professional"];
        Console.WriteLine("First Name: {0}", professional.FirstName);
static void Main(字符串[]args)
{
常量字符串数据=@“结果[“专业”]=
新的
{
FirstName=”“Juan Pablo”“,
LastName=”“Ibañez”“,
认证=新[]
{
新的{Provider=”“MSFT”“,ExamCode=“”70-536”“,Title=“”TS:Microsoft.NET Framework–应用程序开发基金会”“},
新的{Provider=”“MSFT”“,ExamCode=“”70-505”“,Title=“”TS:Microsoft.NET Framework–应用程序开发基金会”“},
新的{Provider=”“MSFT”“,ExamCode=“”70-563”“,Title=“”TS:Microsoft.NET Framework–应用程序开发基金会”“}
},
SayHi=newsystem.Action(()=>System.Console.WriteLine(““Hi”))
};";
var eval=CSharpEvaluator.Evaluate(数据);//返回一个描述变量
动态专业=评估[“专业”];
WriteLine(“名字:{0}”,professional.FirstName);
有什么想法吗


谢谢。

编辑:我想我已经知道了。匿名类型是内部的,因此该类型对
动态
活页夹不可见。现在正在验证

是的,就是这样。请注意确切的错误消息:
'object'不包含“FirstName”的定义。

它使用的是
object
,因为这是您可以从自己的程序集中实际引用对象的唯一类型。这与动态加载的程序集无关,只是它位于不同的程序集中的问题

编辑:如果可以使“发布”程序集应用该属性,则可以使用
[InternalsVisibleTo]
属性绕过此问题。以下是一个示例:

// In Library.dll
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("Test")]

public class Library
{
    public static object Foo()
    {
        return new { ID = 1 };
    }
}

// In Test.exe
using System;

class Test
{
    static void Main()
    {
        dynamic d = Library.Foo();
        Console.WriteLine(d.ID);
    }
}

如果您注释掉该属性,Test.exe会根据您的问题而中断。使用该属性,它工作正常。C#编译器作者会考虑所有问题:)

对不起,Jon,我在问题描述中犯了一个错误。执行语句后:dynamic professional=eval[“professional”]VS正确地向我显示了专业变量的内容。但是,该程序在下一行失败。c#编译器团队的成员从未停止让我感到惊讶。