2013-05-10 132 views
1

我正在尝试将我的应用程序与其他几个应用程序集成。 在一种情况下,我收到以下异常:有没有办法知道是否已经创建了IWin32Window?

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。

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

现在我打算改变我的应用程序接收参数,所以根据上下文我可以运行SetCompatibleTextRenderingDefault(false)或不。

但是我想知道是否有方法可以验证在做SetCompatibleTextRenderingDefault(false)之前是否已经创建了IWin32Window。

如果这是一个愚蠢的问题,我很抱歉,但我以前没有真正用Winforms做过很多工作。

我希望你能给我提供任何帮助。

更新

阅读的第一答案和一些评论后,我想提一提,在那里我有这个问题的背景是相当复杂,我无法在这里完全解释。我很欣赏这些反馈,并且我明白你在说什么。

我认为我的问题的精神被我添加的上下文误解了,我知道错误发生的原因,我知道解决方法并解决问题的方法。

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

毕竟,由于IWin32Window已经创建,所以发生异常,所以我想知道你怎么能知道这一点。再次

感谢。

+1

您可以将该调用放在try/catch中,因为您不太了解代码将用于的上下文。 – Andy 2013-05-10 14:42:53

+0

您很清楚为什么您对此有麻烦。它应该立即在Main()方法中调用。没有合理的情况,在此之前可以创建窗口。如果它是“集成的”,那么它不应该调用方法,因为你不再控制过程配置。 – 2013-05-10 14:47:10

+0

@我在考虑这个问题,是不是会造成任何问题? – Dzyann 2013-05-10 14:58:46

回答

0

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

唯一可能的解决方法是使用自己的自定义窗体继承Winforms窗体。这种方式可以在表单创建时获得。

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

通过设置:

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

我们试图节省一些时间,我们与被整合的应用程序,但是当我们开始有这个错误,我们删除代码,并配合建立他们应该是配置的人兼容性设置。

3

Application.SetCompatibleTextRenderingDefault()只是一个获取正确配置的程序以显示UI的方面。还有更重要的东西需要正确设置,DLL的初始化类型可以是从来没有照顾。超级duper重要的是让这样的程序的主线程成为STA线程,由EXE的Main()入口点上的[STAThread]属性配置。它需要抽取一个消息循环,Application.Run()使窗口保持活动状态,该调用只能在一个线程上进行一次。

EXE必须执行的职责,它不能可靠地由DLL完成。开始一个单独的UI线程是一种可能性,尽管这是一个很好的方法,可能会导致更多的麻烦而不值得。

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 
相关问题