6

HTML ページによって静的にロードされる InitialXAP と、初期 XAP 内のコードからロードされる DynamicXAP の 2 つの異なる XAP を持つ Silverlight アプリケーションがあります。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 に答える