Roh*_*ith 6 reflection silverlight dynamically-loaded-xap
我有一个Silverlight应用程序,它有两个不同的XAP - 一个由HTML页面静态加载的InitialXAP和一个从初始XAP中的代码加载的DynamicXAP.DynamicXAP加载了与此类似的代码:
var asm = LoadAssemblyFromXap(stream, "DLLName");
// LoadAssemblyFromXAP will load the DynamicXAP as a file stream,
// unpack it and load DLLName as a dll.
var controllerType = asm.GetType("ClassNameToInstantiate_InsideAsm");
var constructor = controllerType.GetConstructor(Type.EmptyTypes);
return constructor.Invoke(null);
Run Code Online (Sandbox Code Playgroud)
我有一个使用反射(特别是FieldInfo.GetValue)来进行数据绑定的类.该类在InitialXAP中定义.如果我尝试在DynamicXAP中使用此类,则会收到错误消息:
Message: Unhandled Error in Silverlight Application System.FieldAccessException: Class.In.DynamicXAP.Which.Uses.The.Reflection.Class.In.InitialXAP
at System.Reflection.RtFieldInfo.PerformVisibilityCheckOnField(IntPtr field, Object target, IntPtr declaringType, FieldAttributes attr, UInt32 invocationFlags)
at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency)
at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck)
at System.Reflection.RtFieldInfo.GetValue(Object obj)
Run Code Online (Sandbox Code Playgroud)
我可以通过使用反射创建类的子类并使用反射覆盖方法来解决此错误,如下所示:
public class InitialXAP.ClassUsingReflection {
public virtual object GetValue()
{
return fieldInfo.GetValue(parent);
}
}
public class ClassUsingReflection : InitialXAP.ClassUsingReflection {
public override object GetValue()
{
return fieldInfo.GetValue(parent);
}
}
Run Code Online (Sandbox Code Playgroud)
但我希望通过允许DynamicXAP中的InitialXAP反射来避免这种重复.关于我能做什么的任何想法?
尽管有一个学习曲线,但我会考虑 Silverlight MEF 或 Prism(两者最终在最新的Prism 4 Beta中结合在一起)。它们都支持模块的动态加载,并强制执行良好的重用和单独/团队开发模式。