Excel VBA和c# DLL:实例化WinForms对象只能做一次.第二次尝试出现错误

本文关键字:一次 第二次 错误 DLL VBA 实例化 对象 WinForms Excel | 更新日期: 2023-09-27 18:15:19

我构建了一个包含Winform的c# dll。我想从Excel VBA打开表单。第一次尝试总是成功的。它打开了,做了所有我想让它做的事情。然后用右上方的红色x关闭它

当我尝试第二次打开它时,我总是得到错误信息:"SetCompatibleTextRenderingDefault必须在应用程序中创建第一个IWin32Window对象之前调用。"来源:System.Windows.Forms

WinForms类是Visual Studio生成的标准类。我在另一个类中实例化它:

namespace Schnittstellenvererbung
{
    [ComVisible(true), Guid("5D16EABF-B89F-45A1-8E4D-ACFAA084BF6F")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ISchnittstellenvererbung
    {
        string ShowForm1();
    }
    [ComVisible(true), Guid("6A9EF0BB-BFF3-456E-B025-CB6A25F81F59")]
    [ProgId("Test.SchnittstellenvererbungExecuteProgram")]
    [ClassInterface(ClassInterfaceType.None)]
    public class ExecuteProgram : ISchnittstellenvererbung
    {
        public string ShowForm1()
        {
           try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Form1 Oberflaeche;
                Oberflaeche = new Form1();
                Oberflaeche.ShowDialog();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message + e.Source);
            }
            return "Done";
        }
    }
}

在Excel VBA的调用是非常简单的:

Sub test()
    Dim y As String
    Dim x As New Schnittstellenvererbung.ExecuteProgram
    y = x.ShowForm1
End Sub

当我关闭Excel并重新打开它时,它在第一次尝试时再次工作,但第二次尝试再次失败。

我想知道为什么会出现这个错误,因为SetCompatibleTextRenderingDefault方法总是在实例化表单之前被调用。

想法?

Excel VBA和c# DLL:实例化WinForms对象只能做一次.第二次尝试出现错误

我在msdn中找到了一个解决方案。Windows窗体运行在一个单独的线程中。示例代码是VB编写的,但转换为c#并不困难。如果有人需要帮助,可以用teleriks代码转换器转换。

链接:

MSDN方案:https://msdn.microsoft.com/en-us/library/ms229591%28v=vs.110%29.aspx

代码转换器:http://converter.telerik.com/