2009-02-07 80 views
2

對於我的一個項目,我需要在運行時生成一些類,並且我認爲使用Reflection.Emit會相當簡單,但是當我運行一些生成的調用方法的代碼時,我得到MemberAccessExceptions標記在發生器組件內部。有什麼辦法可以告訴運行時,動態程序集應該能夠直接訪問我自己的代碼嗎?我真的不想公開向我的圖書館的消費者公開任何這些成員。 如何讓Reflection.Emit程序集訪問生成程序集中的內部成員?


關於InternalsVisibleTo,我不確定如何在動態生成的程序集中使用它。這甚至有可能嗎?

+0

您嘗試過InternalsVisibleTo嗎? – tuinstoel 2009-02-07 07:17:44

回答

3

InternalsVisibleTo通過向其他人開放作品。因此,如果要使用生成的類型中的程序集Foo,則必須在AssemblyInfo.cs中爲Foo指定生成的程序集的名稱。

如果您使用AssemblyBuilder類發出新裝配體,則可以爲生成的裝配體指定名稱。該名稱必須與用於程序集Foo中的InternalsVisibleTo屬性的名稱相匹配。

0

我想有一個原因背後的事實,你的生成大會的成員標記爲內部。

您可以在公開方法中公開必要的功能,或者只剩下兩個選擇:InternalsVisibleTo(作爲@tuinstoel在評論部分中提到)或Reflection(使用反射可以訪問不同程序集中的非公共成員) 。

+0

我不確定如何在動態生成的程序集中使用它。這甚至有可能嗎? – 2009-02-07 14:02:57