6

我有一个 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);

我有一个类使用反射(特别是 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)

我可以通过使用反射创建类的子类并使用反射覆盖方法来解决此错误,如下所示:

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);
        }
}

但我更愿意通过允许 DynamicXAP 中的 InitialXAP 进行反射来避免这种重复。关于我能做什么的任何想法?

4

2 回答 2

1

虽然有一个学习曲线,但我会看看 Silverlight MEF 或 Prism(两者终于在最新的Prism 4 Beta中结合在一起)。它们都支持模块的动态加载,并为重用和单独/团队开发强制执行良好的模式。

于 2010-08-19T19:56:24.633 回答
0

InitialXAP.ClassUsingReflection...

请注意,副本不是初始xap命名空间 ( ClassUsingReflection) 的一部分,并且可以被导入。注意GetVisible- 因为动态 xap 不可见......只需留下重复项(显然带走基类)并尝试。

于 2010-10-19T21:07:46.010 回答