关闭在DLL中调用的C#WinForms App时,Excel意外关闭

时间:2016-06-13 10:59:47

标签: c# winforms vba dll interop

我有一个C#Winforms-Application。我已将项目的输出类型设置为“类库”并使其可见,因此我可以在Excel中的VBA代码中引用它。因此,我可以通过Excel启动我的WinForms-App。

到目前为止一切正常。在我的VBA代码中,我正在调用这样的应用程序(宏):

Dim app As MyWinFormsApp.Program
Set app = New MyWinFormsApp.Program
Dim result As Integer
result = app.Main()

我的C#-Code中的程序类看起来像这样:

public int Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
        return 0;
    }

当我启动我的宏时,WinForms窗口打开,程序运行正常。

我的问题是:当我通过单击红色X关闭WinForms窗口时,Excel也会意外关闭。

我已经发现的是:

在我的C#类Form1.Designer.cs中,我有这个Dispose-Method:

protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

当我调用base.Dispose() - 传递'false'的方法

base.Dispose(false);

当我关闭WinForms-Window时,Excel没有意外关闭,但是当我想要关闭Excel之后,它是不可能的。我得到了这个'Mouse-Wait-Symbol'并且无法做任何事情所以我必须在TaskManager中杀掉Excel-Process。

(我也尝试过使用一个新的WinForms-Project,它在我原来的项目中没有做任何事情我做错了什么......我有完全相同的行为。)

所以我的问题是:有谁知道如何关闭我的WinForms-App,然后以“正常方式”关闭Excel。

非常感谢!

2 个答案:

答案 0 :(得分:0)

在关闭winform之前,尝试将Application.UserControl属性更改为true。

"当对象的UserControl属性为False时,在释放对象的最后一个编程引用时释放该对象。如果此属性为False,则Microsoft Excel将在会话中的最后一个对象释放时退出。" https://msdn.microsoft.com/library/office/ff841219.aspx

答案 1 :(得分:0)

问题是Application.Run()的使用。 如果您从VBA调用表单,则应使用frm.show()。

然后它将像魅力一样工作。 c#中的示例:

        public void InitializeForm()
    {
        Form1 Form = new Form1();
        Form.Show();
    }

VBA中的示例:

Sub OpenForm()
Dim CallForm As New CallAndInitialize
CallForm.InitializeForm End Sub