我正在尝试将我的应用程序与其他几个程序集成。 在一个案例中,我得到以下例外:
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已经创建,所以我想知道你怎么知道。
再次感谢。
答案 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