有没有办法知道是否已经创建了IWin32Window?

时间:2013-05-10 14:29:55

标签: c# winforms

我正在尝试将我的应用程序与其他几个程序集成。 在一个案例中,我得到以下例外:

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已经创建,所以我想知道你怎么知道。

再次感谢。

3 个答案:

答案 0 :(得分:3)

Application.SetCompatibleTextRenderingDefault()只是一个方面,可以正确配置程序以显示UI。还有更重要的东西需要正确设置,DLL可以从不处理的初始化类型。 Super-duper对于将这样的程序的主线程作为STA线程很重要,由EXE的Main()入口点上的[STAThread]属性配置。它需要抽一个消息循环,Application.Run()来保持窗口活着,该调用只能在一个线程上进行一次。

EXE必须执行的职责,DLL无法可靠地完成。启动一个单独的UI线程是一种可能性,虽然这是一种比它的价值更多麻烦的好方法。

答案 1 :(得分:0)

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

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

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

通过设置:

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

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

答案 2 :(得分:0)

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

之前:

var socket = new SockJS('/hello');
                     stompClient = Stomp.over(socket);
                     stompClient.connect({}, function(frame) {
                         console.log('Connected: ' + frame);
                         stompClient.subscribe('/topic/greetings', function(greeting){
                             console.log(JSON.parse(greeting.body));

                         });
    // to send via the web service-WORKING ( but websocket not called in springs)
     $.post("http://localhost:8080/meeting");

    // to send via websocket - WORKING
    stompClient.send("/app/hello", {}, JSON.stringify({ 'message':'message'}));

后:

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