2015-09-02 40 views
0

我已經創建usercontrol實例到單獨的appdomain並將其轉換爲INativeHandleContract作爲每個插件框架指南,我能夠將框架實例的引用傳遞到主機應用程序域。當我將主體應用程序appdomain中的INativeHandleContract轉換回UIElement時,我無法將UIElement轉換爲我的自定義接口類型。無法將'MS.Internal.Controls.AddInHost'轉換回類型'System.Windows.Controls.UserControl'或將其轉換爲我的自定義界面

任何人都可以告訴我是否可以將Framework元素轉換爲userControl或將其轉換爲我的自定義界面?

這裏是代碼的一部分:

public INativeHandleContract GetControl(string AssemblyName, string strFullNamespaceName) 
    { 
     var assembly = Assembly.LoadFrom(m_strAssemblyDirectory + AssemblyName); 
     var type1 = typeof(IUPiAssemblyProcedure); 
     var type2 = typeof(IUPiCardProcedure); 
     var type3 = typeof(IUPiDatabaseFrame); 
     var type4 = typeof(IUPiUserFrame); 
     var t = from T in assembly.GetTypes() where type1.IsAssignableFrom(T) || type2.IsAssignableFrom(T) || type3.IsAssignableFrom(T) || type4.IsAssignableFrom(T) select T; 
     if (t.Count<Type>() == 0) return null; 
     var tName = t.First<Type>().FullName; 
     return FrameworkElementAdapters.ViewToContractAdapter((FrameworkElement)assembly.CreateInstance(tName)); 
    } 

public void LoadUserControl(INativeHandleContract contract) 
    { 
     var uControl = FrameworkElementAdapters.ContractToViewAdapter(contract); 

     var t = uControl.GetType(); 
     t.GetMethod("methodName"); 
     ... 
    } 

我的目標是在調用自定義的接口定義了一些方法,通過我已經裝在裝配的類型之一來實現。

問候 蒂霍米爾Blagoev

回答

0

我找到了解決辦法!正如here所述,「由於主機應用程序獲取HwndHost,主機應用程序無法將由ContractToViewAdapter返回的對象轉換爲它通過加載項實現的類型(例如UserControl)。」

所以,如果我想在我的子域到達類型實例,我已經通過我的代理做到這一點:

public class Main 
{ 
    private AppDomain ad = null; 
    private proxy remoteWorker = null; 

    public INativeHandleContract LoadAssembly(string assemblyname, string fullInterfaceName) 
    { 
     if (ad != null) 
     { 
      AppDomain.Unload(ad); 
     } 
     var domSetup = new AppDomainSetup(); 

     domSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 
     domSetup.PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory; 
     domSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
     domSetup.LoaderOptimization = LoaderOptimization.MultiDomainHost; 
     var adevidence = AppDomain.CurrentDomain.Evidence; 

     ad = AppDomain.CreateDomain(assemblyname, adevidence, domSetup); 

     ad.AssemblyResolve += ad_AssemblyResolve; 
     AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

     remoteWorker = (proxy)ad.CreateInstanceAndUnwrap(typeof(proxy).Assembly.FullName, "INATO.UPINAIS.UCLibrary.proxy"); 
     return remoteWorker.GetControl(assemblyname, fullInterfaceName); 
    } 

    public void DoTheTrick() 
    { 
     var uControl = LoadAssembly("assemblyName", "interfaceName"); 
     panel.Content = FrameworkElementAdapters.ContractToViewAdapter(uControl); 
     remoteWorker.RemoteInvoke("methodName", new object[] { }); 
    } 
} 

public class proxy : MarshalByRefObject 
{ 
    private object _currentInstance; 

    public INativeHandleContract GetControl(string AssemblyName, string strFullNamespaceName) 
    { 
     var assembly = Assembly.LoadFrom(m_strAssemblyDirectory + AssemblyName); 
     var type1 = typeof(IUPiAssemblyProcedure); 
     var type2 = typeof(IUPiCardProcedure); 
     var type3 = typeof(IUPiDatabaseFrame); 
     var type4 = typeof(IUPiUserFrame); 
     var t = from T in assembly.GetTypes() where type1.IsAssignableFrom(T) || type2.IsAssignableFrom(T) || type3.IsAssignableFrom(T) || type4.IsAssignableFrom(T) select T; 
     if (t.Count<Type>() == 0) return null; 
     var tName = t.First<Type>().FullName; 
     _currentInstance = assembly.CreateInstance(tName); 
     return FrameworkElementAdapters.ViewToContractAdapter((FrameworkElement)_currentInstance); 
    } 

    public void RemoteInvoke(string methodName, object[] parameters) 
    { 
     var type = _currentInstance.GetType(); 
     var mi = type.GetMethod(methodName); 
     mi.Invoke(_currentInstance, parameters); 
    } 
} 
相關問題