代码之家  ›  专栏  ›  技术社区  ›  Deepak Sharma

将WPF DLL加载并运行到另一个WPF exe中

  •  2
  • Deepak Sharma  · 技术社区  · 10 年前

    我的主要问题正如我在标题中所述。

    WPF_APP1->我在排除App.xaml之后创建了这个wpf项目的dll
    WPF_APP2->正常WPF exe。其需要运行上述WPF_APP1 dll并使用反射打开WPF_APP2主窗口窗体。

    我为什么要说反思- 工作包应用程序2 首先获取最新信息 WPF_APP1.dll 然后打开,这样就不能添加dll的引用。只能使用反射。

    当我在cmd项目中使用上述dll时,它是可以的。它打开CMD窗口,然后启动 WPF_APP1主窗口 作为窗口形式。

    但是现在我需要打开这个窗口窗体,而不是在cmd中,在 工作包应用程序2 .

    请帮帮我。

    CMD项目使用以下代码打开 工作包应用程序1 主窗口。

        static void Main(string[] args)
        {            
            Thread t = new Thread(ThreadProc);
            t.SetApartmentState(ApartmentState.STA);
            t.IsBackground = true;
            t.Start();
    
            Console.ReadLine();                   
        }
    
    
        private static void ThreadProc()
        {
            string loc = new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName
                          + "\\AutoUpdateTesting.dll";
    
            Assembly dll = Assembly.LoadFile(loc);
    
            foreach (Type type in dll.GetExportedTypes())
            {                
                if (type.Name.Equals("MainWindow"))
                {                   
                    dynamic n = null;
                    n = Activator.CreateInstance(type);
                    n.InitializeComponent();
                    System.Windows.Application apprun = new System.Windows.Application();
                    apprun.Run(n);
    
                    break;
                }
            }
    
        }
    

    我不能用线-

        System.Windows.Application apprun = new System.Windows.Application();
    

    在WPF_APP2中,因为AppDomain(在谷歌上找到此原因)。尝试其他选择,但没有运气。

    请查看并分享您的知识。:)

    等待您的评论和回复。

    谢谢

    2 回复  |  直到 10 年前
        1
  •  3
  •   Stígandr    10 年前

    从表单应用程序加载WPF窗口:

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            ThreadProc();
            Application.Run(); // Keep on running!
        }
    
        private static void ThreadProc()
        {
            if (System.Windows.Application.Current == null)
                new System.Windows.Application();
            try
            {
                string assemblyName = string.Format("{0}\\AutoUpdateTesting.dll", new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName);
                System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
                {
                    Window wnd = LoadAssembly(assemblyName, "OtherWindow");
                    wnd.Show();
                }));
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Failed to load window from{0} - {1}", "OtherWindow", ex.Message));
                throw new Exception(String.Format("Failed to load window from{0} - {1}", "OtherWindow", ex.Message), ex);
            }
        }
    
        private static Window LoadAssembly(String assemblyName, String typeName)
        {
            try
            {
                Assembly assemblyInstance = Assembly.LoadFrom(assemblyName);
                foreach (Type t in assemblyInstance.GetTypes().Where(t => String.Equals(t.Name, typeName, StringComparison.OrdinalIgnoreCase)))
                {
                    var wnd = assemblyInstance.CreateInstance(t.FullName) as Window;
                    return wnd;
                }
                throw new Exception("Unable to load external window");
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Failed to load window from{0}{1}", assemblyName, ex.Message));
                throw new Exception(string.Format("Failed to load external window{0}", assemblyName), ex);
            }
        }
    }
    

    这就是表单的诀窍!请记住,您需要添加对基本WPF程序集(PresentationCore、WindowBase+++)的引用

    WPF加载外部窗口 (把你的帖子读错了,所以这里也有wpf到wpf)

    public partial class App : Application
    {
        App()
        {
            Startup += App_Startup;
        }
    
        void App_Startup(object sender, StartupEventArgs e)
        {
            try
            {
                string assemblyName = string.Format("{0}\\AutoUpdateTesting.dll", new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName);
                Window wnd = LoadAssembly(assemblyName, "OtherWindow");
                wnd.Show();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Failed to load window from{0} - {1}", "OtherWindow", ex.Message));
                throw new Exception(String.Format("Failed to load window from{0} - {1}", "OtherWindow", ex.Message), ex);
    
            }
        }
    
        private Window LoadAssembly(String assemblyName, String typeName)
        {
            try
            {
                Assembly assemblyInstance = Assembly.LoadFrom(assemblyName);
                foreach (Type t in assemblyInstance.GetTypes().Where(t => String.Equals(t.Name, typeName, StringComparison.OrdinalIgnoreCase)))
                {
                    var wnd = assemblyInstance.CreateInstance(t.FullName) as Window;
                    return wnd;
                }
                throw new Exception("Unable to load external window");
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Failed to load window from{0}{1}", assemblyName, ex.Message));
                throw new Exception(string.Format("Failed to load external window{0}", assemblyName), ex);
            }
        }
    }
    

    希望它有帮助!

    干杯

    什蒂安

        2
  •  0
  •   Noctis    10 年前

    不是答案,而是建议:

    我会改变:

    foreach (Type type in dll.GetExportedTypes())
    {                
        if (type.Name.Equals("MainWindow"))
        {                   
            dynamic n = null;
            n = Activator.CreateInstance(type);
            n.InitializeComponent();
            System.Windows.Application apprun = new System.Windows.Application();
            apprun.Run(n);
    
            break;
        }
    }
    

    具有:

    // replacing the loop, brackets and break with:
    var main_win = dll.GetExportedTypes().Where(t => t.Name.Equalts("MaindWindow");
    
    dynamic n = null;
    n = Activator.CreateInstance(type);
    n.InitializeComponent();
    System.Windows.Application apprun = new System.Windows.Application();
    apprun.Run(n);
    

    让linq操心吧,让代码更容易阅读和维护。