为什么动态关键字无法使用动态加载的程序集?
我正在研究一个CSharp表达式求值程序,可以使用,如下所示。该组件生成代码并在内存中编译它,之后,它加载生成的程序集,创建生成的类的实例并运行它。结果保存在字典中。
我的问题是所有运行正常,直到最后一行代码失败,异常:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'object'不包含'FirstName'的定义。
但是,Visual Studio能够向我展示专业变量内容:
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);
有任何想法吗?
谢谢。
没有找到相关结果
已邀请:
1 个回复
笛驮型迸
活页夹不可见。立即验证...... 是的,就是这样。请注意确切的错误消息:
它使用的是ѭ4,因为这是你可以从你自己的程序集中实际引用对象的唯一类型。这与动态加载的程序集无关 - 它只是在一个不同的程序集中。 编辑:你可以使用
属性绕过这个,如果你可以让你的“发布”程序集应用它。这是一个例子:
如果您注释掉该属性,Test.exe会根据您的问题中断。使用该属性,它工作正常。 C#编译器的作者想到了一切:)