簡體   English   中英

為什么動態關鍵字不能用於動態加載的程序集?

[英]Why doesn't dynamic keyword work with dynamically loaded assemblies?

我正在研究一個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);

有任何想法嗎?

謝謝。

編輯:我想我已經知道了。 匿名類型是內部類型,因此dynamic綁定器不會看到該類型。 立即驗證......

是的,就是這樣。 請注意確切的錯誤消息: 'object' does not contain a definition for '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#編譯器的作者想到了一切:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM