C# 使用Mono.WinForms时Unity编辑器中的RegisterClass错误

C# 使用Mono.WinForms时Unity编辑器中的RegisterClass错误,c#,winforms,mono,unity3d,registerclass,C#,Winforms,Mono,Unity3d,Registerclass,我正在使用Mono.WinForms在Unity中创建外部窗口,它工作得非常好,只是每次播放场景时都会收到此错误消息(但Unity刚启动时从未出现过): 无法注册窗口类,win32错误0 我想这是因为当我停止场景时表单类没有被注销。当我重新启动Unity时,它们确实会被注销,而当我进行构建时,它们不会出现问题,这是有道理的 我两次出现此弹出错误,原因是: myForm=newform1() myForm.Show() 我浏览了XplatUIWin32.cs文件的代码,找到了RegisterWin

我正在使用
Mono.WinForms
在Unity中创建外部窗口,它工作得非常好,只是每次播放场景时都会收到此错误消息(但Unity刚启动时从未出现过):

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

我想这是因为当我停止场景时表单类没有被注销。当我重新启动Unity时,它们确实会被注销,而当我进行构建时,它们不会出现问题,这是有道理的

我两次出现此弹出错误,原因是:

  • myForm=newform1()
  • 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的mono版本作为参考,在Visual Studio中编译代码并在Unity中导入生成的dll。除了那些弹出错误,它工作得很好

    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
    查看显示
    类名的
    消息框
    信息

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

    但是!!
    我仍然可以看到带有“Mono.WinForms.1.40”信息的消息框

    我认为第二个类是
    SWFClass1
    ,以
    IntPtr.Zero
    作为父类,但是当我尝试注销它时,即使表单已关闭并被释放,它仍返回
    False