【发布时间】:2013-08-26 15:41:23
【问题描述】:
我正在使用动态关键字来处理外部程序集,就访问它的方法和原始类型成员而言,它工作正常。所以例如我的类动态加载的类看起来像followig:
public class Student
{
public bool IsGood { get; set; }
public StudentType St { get; set; }
public University University { get; set; }
}
我可以通过执行以下操作从程序集中动态加载对象:
var assembly = Assembly.LoadFrom("//path");
Type type = assembly.GetType("TestFrameWork.Student");
var student = Activator.CreateInstance(type);
以下代码失败:
student.IsGood = true;
student.St = TestFrameWork.StudentType.SomethingElse;
Student Type 是来自动态加载程序集的 Enum;
我可以得到学生对象。现在是有趣的部分。我可以称之为方法。我可以得到它的所有属性。我可以设置它的原始属性
所以我几乎可以做 student.IsGood = true;它将设置该属性。如果我有其他类型为 int、float 等的原始属性,这同样适用。
但是
当我尝试将其设置为动态加载程序集的原生属性时,它会因 RuntimeBinderException 而失败
例如,
如果我尝试执行 student.University = new University() ,其中 University 是加载程序集的本机类型。它失败。
这是堆栈跟踪:
在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,布尔值 publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 在 System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis、布尔填充缓存、StackCrawlMark 和 stackMark)在 System.RuntimeType.CreateInstanceDefaultCtor(布尔 publicOnly, Boolean skipCheckThis、Boolean fillCache、StackCrawlMark& stackMark)
在 System.Activator.CreateInstance(类型类型,布尔非公共)在 System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr,Binder 活页夹,对象 [] 参数,CultureInfo 文化,对象 [] 激活属性、StackCrawlMark 和 stackMark)在 System.Activator.CreateInstance(类型类型,BindingFlags bindingAttr, Binder 活页夹、Object[] 参数、CultureInfo 文化、Object[] 激活属性)在 System.Reflection.Assembly.CreateInstance(字符串类型名称,布尔值 ignoreCase,BindingFlags bindingAttr,Binder binder,Object[] args, CultureInfo 文化,对象 [] 激活属性)在 System.Reflection.Assembly.CreateInstance(String typeName) 在 TaskManagementFramework.PluginModule.CreateInstanceT 在 c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\Plugin 加载\PluginModule.cs:第 19 行 TaskManagementFramework.PluginLifecycleManager.GetPluginInstance(字符串 id,字符串 parentXmlSectionDescription,类型预期接口, Boolean useSingleInstance, IPlugin& plugin) in c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\Plugin Loading\PluginLifecycleManager.cs:第 53 行 TaskManagementFramework.PluginsXmlParser.ParsePlugins(XElement pluginsListElement, String parentXmlSectionDescription, PluginLifecycleManager pluginLifecycleManager, List`1& plugins) in c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\XML 解析\PluginsXmlParser.cs:第 39 行
知道为什么吗?我通过互联网搜索没有专门解决这个问题..
【问题讨论】:
-
提供堆栈跟踪。
-
我在问题中添加了堆栈跟踪
-
学生中的大学类型似乎与您尝试分配的类型不同。我希望有一个无效的强制转换异常,但该信息可能被隐藏或作为内部异常提供。
-
您可能还想提供一个小的独立复制问题供其他人调试。
-
@leppie :我的代码很小。我刚刚编辑了问题并添加了失败的代码。如果您需要更多信息,请告诉我..
标签: c# .net c#-4.0 dynamic .net-4.0