1

我正在尝试将我的应用程序与其他几个应用程序集成。在一种情况下,我收到以下异常:

System.InvalidOperationException was unhandled by user code
Message=SetCompatibleTextRenderingDefault must be called before the first IWin32Window object is created in the application.

这个例外是因为我正在尝试做:

System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);

我试图集成的应用程序已经创建了一些 IWin32Window。

我四处搜索,我得到的是,SetCompatibleTextRenderingDefault(false)如果已经有 IWin32Window,我基本上不应该尝试。但是由于我的应用程序将被集成到其他各种应用程序中,因此每种情况下的条件都会发生变化。

现在我计划更改我的应用程序以接收参数,以便根据上下文我可以运行SetCompatibleTextRenderingDefault(false)或不运行。

但相反,我想知道是否有一种方法可以验证在执行SetCompatibleTextRenderingDefault(false).

如果这是一个愚蠢的问题,我很抱歉,但我之前并没有真正使用过 Winforms。

我将不胜感激您能给我的任何帮助。

更新

在阅读了第一个答案和一些评论后,我想提一下,我遇到这个问题的上下文相当复杂,我在这里无法完全解释。感谢您的反馈,我理解您在说什么。

我认为我添加的上下文误解了我的问题的精神,我知道为什么会发生错误,并且我知道解决它并解决问题的方法。

我只是想知道是否有办法知道是否已经创建了 IWin32Window ?

毕竟,异常正在发生,因为 IWin32Window 已经创建,所以我想知道你怎么知道。

再次感谢。

4

3 回答 3

3

Application.SetCompatibleTextRenderingDefault() 只是正确配置程序以显示 UI 的一个方面。还有更重要的东西需要正确设置,DLL永远无法处理的那种初始化。让这样的程序的主线程成为 STA 线程非常重要,由 EXE 的 Main() 入口点上的 [STAThread] 属性配置。它需要泵送一个消息循环 Application.Run() 以保持窗口处于活动状态,该调用只能在线程上进行一次。

EXE 必须执行的任务,它不能由 DLL 可靠地完成。启动一个单独的 UI 线程是可能的,尽管它会造成比其价值更多的麻烦。

于 2013-05-10T15:34:29.227 回答
0

无法知道 IWin32Window 是否已在我的上下文中创建(框架不提供)。

唯一可能的解决方法是拥有自己的继承自 Winforms 表单的自定义表单。这样您就可以在创建表单时获得。

我不能这样做,因为我的应用程序与许多其他应用程序集成在一起,而且我不能强迫它们全部使用 Windows 窗体以外的应用程序。

通过设置:

System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);

我们试图为我们正在集成的应用程序节省一些时间,但是当我们开始出现此错误时,我们删除了代码,并确定它们应该是配置兼容性设置的代码。

于 2013-11-14T17:33:51.567 回答
0

我必须检查表单的每个静态变量以确保它们在开始时设置为 null,并在 SetCompatibleTextRenderingDefault() 之后创建实例

前:

public static FormMessage s_formShutdownMsg = new FormMessage(); //somewhere in the project

后:

static void Main()
       {
            public static Form1 s_mainForm = null;
            try
            {

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                s_formShutdownMsg = new FormMessage();
                s_mainForm = new Form1();
                Application.Run(s_mainForm);
            }
            catch (Exception e)
            {
            }
      }
public static FormMessage s_formShutdownMsg = null; //somewhere in the project
于 2016-08-12T13:56:05.630 回答