3

Mono.WinForms用来在 Unity 中创建外部窗口,它工作得很好,除了我每次播放场景时都会收到此错误消息(但从来没有第一次在 Unity 新启动时):

无法注册窗口类,win32 错误 0。

我认为这是因为当我停止场景时表单类没有取消注册。当我重新启动 Unity 时,它们确实会取消注册,并且在我构建时我没有遇到问题,这是有道理的。

我两次收到此弹出错误,这是由以下原因引起的:

  1. myForm = new Form1();
  2. myForm.Show();

我浏览了XplatUIWin32.cs文件的代码并找到了RegisterWindowClass方法。当 Mono 注册一个类时,它会这样做:

class_name = string
         .Format("Mono.WinForms.{0}.{1}", 
           System.Threading.Thread.GetDomainID ().ToString (), classStyle);

所以我设法通过这样做摆脱了第二个错误:

UnregisterClass("Mono.WinForms.1.0", IntPtr.Zero);

所以我的问题是为什么它只适用于第二个弹出错误,我如何摆脱第一个?我试图强制垃圾收集,但没有帮助。我试图找到另一个注册的班级名称,但这里也没有运气。

对于信息,我使用 System.Windows.Forms.dll 的单声道版本作为参考,在 Visual Studio 中编译我的代码并将生成的 DLL 导入 Unity。除了那些弹出错误之外,它的效果很好。

4

1 回答 1

0
class_name = string.Format ("Mono.WinForms.{0}.{1}", System.Threading.Thread.GetDomainID ().ToString (), classStyle);

两个类名应该是:

  • Mono.WinForms.1.0
  • Mono.WinForms.1.40

我使用 dnspy 补丁System.Windows.Forms.dll来查看显示的MessageBox信息class_name

我认为classStyle可能不固定,最好尝试不同的数字。

但!!我仍然收到显示“Mono.WinForms.1.40”信息的消息框

于 2018-07-19T08:53:21.537 回答