【问题标题】:Multiple WPF applications in the same AppDomain同一个 AppDomain 中的多个 WPF 应用程序
【发布时间】:2015-02-18 14:55:42
【问题描述】:

我得到了以下设置:

WPF_Application.exe

一个包含 WinForms 窗口和 WPF 窗口的 DLL。

“WPF_Application.exe”从 DLL 调用 WinForms 窗口,WinForms 窗口在 DLL 中创建 WPF 窗口的实例。

这会产生以下异常:

不能在同一个 AppDomain 中创建多个 System.Windows.Application 实例。

尝试了不同的方法,但不知道如何解决。

【问题讨论】:

    标签: c# wpf winforms


    【解决方案1】:

    我通过将调用的 wpf 窗口的应用程序分配给 Application.Current 窗口来修复它:

      if (Application.Current == null)
      {
           MyApplication = new Application
           {
              ShutdownMode = ShutdownMode.OnExplicitShutdown
           };
       }
       else
           MyApplication = Application.Current;
    

    【讨论】:

    • 谢谢。为了简化:MyApplication = Application.Current ?? new Application {ShutdownMode = ShutdownMode.OnExplicitShutdown}
    【解决方案2】:

    System.Windows.Application 是一个单例:它的构造函数只能被调用一次(包括 App.xaml de-xamlization),否则会抛出异常。

    恐怕您对此无能为力,除了可能在启动第二个应用程序之前检查 Application.Current 是否已设置,并在某种程度上使用该实例来加载它。

    或者您可以创建另一个 AppDomain,并使用它来启动第二个应用程序。

    【讨论】:

    • 我还在等待来自 winforms 应用程序的返回值。
    • Application 不是单例。这是一个普通的公共课。构造函数可见的事实清楚地表明了这一点。可以根据需要经常调用公共构造函数。根据定义,每个AppDomain 只允许一个实例。 AppDomain 的多个实例可能会导致Application 的多个实例 => 没有 Singleton(共享实例)。
    • @BionicCode 如果您多次调用公共构造函数,则会抛出异常。随心所欲地称呼它:我喜欢单身人士。请指导我如何跨多个 AppDomain 实现单例(不使用命名信号量等系统范围的技巧)。
    • 正如我之前所说,每个 AppDomain 只允许创建一个实例。单例模式有不同的定义。单例意味着每个应用程序一个实例。一个应用程序可以运行多个 AppDomain 实例。它们是有区别的。 Singleton 也是一种模式,它也避免为了控制实例化而暴露构造函数。 Singleton 实例永远不会显式创建,这就是为什么没有使用公共构造函数的原因。单例实例是静态的,因为该实例是通过静态类属性公开的。
    • 您需要跨域编组实例或共享实例:MarshalByRefObject。您必须扩展您的 Singleton 实现以正确编组共享实例。
    【解决方案3】:

    确保您在 XAML 中只定义了一个应用程序。

    Visual Studio 在创建新的 WPF 解决方案时会创建一个 App.xaml,如果您创建了一个带有 <Application></Application> 标记的新 .xaml 文件,这将导致此错误,并且该解决方案将在运行时构建但失败。

    删除重复的应用程序并使用WindowUserControl 拥有多个窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2011-10-21
      • 2016-11-26
      • 1970-01-01
      相关资源
      最近更新 更多