我有一个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。
非常感谢!
答案 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