2013-05-10 133 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 
相關問題