我正在使用动态关键字与外部程序集一起工作,就访问它的方法和原始类型成员而言,它工作正常。因此,例如,我的类动态加载的类如下所示:
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);
它在以下代码上失败:
学生.IsGood = true;
学生.St = TestFrameWork.StudentType.SomethingElse;
学生类型是来自动态加载程序集的枚举;
我可以得到学生对象。现在是有趣的部分。我可以称之为方法。我可以得到它的所有属性。我可以设置它的原始属性
所以我几乎可以做 student.IsGood = true; 它将设置该属性。如果我有其他类型为 int、float 等的原始属性,这同样适用。
但
当我尝试将其设置为动态加载程序集的本机属性时,它因 RuntimeBinderException 而失败
例如,
如果我尝试做 student.University = new University() 其中大学是加载程序集的本机类型。它失败。
这是堆栈跟踪:
在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,RuntimeMethodHandleInternal& ctor,Boolean& bNeedSecurityCheck)在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache,StackCrawlMark 和 stackMark)在 System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark & stackMark)
在 System.Activator.CreateInstance(Type type, Boolean nonPublic) 在 System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfoculture, Object[] activationAttributes, StackCrawlMark& stackMark) 在 System.Activator.CreateInstance(Type类型、BindingFlags bindingAttr、BindingFlags bindingAttr、Object[] args、CultureInfo 文化、Object[] activationAttributes) at System.Reflection.Assembly.CreateInstance(String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo 文化, System.Reflection.Assembly.CreateInstance(String typeName) 中的 Object[] activationAttributes),位于 c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\Plugin Loading\PluginModule.cs 中的 TaskManagementFramework.PluginModule.CreateInstanceT:c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\Plugin Loading\PluginLifecycleManager.cs 中 TaskManagementFramework.PluginLifecycleManager.GetPluginInstance(String id, String parentXmlSectionDescription, Type expectedInterface, Boolean useSingleInstance, IPlugin& plugin) 的第 19 行:TaskManagementFramework.PluginsXmlParser.ParsePlugins( XElement pluginsListElement, String parentXmlSectionDescription, PluginLifecycleManager pluginLifecycleManager, List`1& plugins) in c:\Dropbox\CPTFramework_DynamicLoading\TaskManagementFramework\XML Parsing\PluginsXmlParser.cs:line 39\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 Parsing\ PluginsXmlParser.cs:第 39 行\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 Parsing\ PluginsXmlParser.cs:第 39 行
知道为什么吗?我通过互联网搜索没有专门解决这个问题..