2016-06-13 45 views
0

我有一個C#Winforms應用程序。我已經將項目的輸出類型設置爲'類庫',並使其可見,所以我可以在Excel中的VBA代碼中引用它。因此,我可以通過Excel啓動我的WinForms-App。當關閉在DLL中調用的C#WinForms應用程序時,Excel意外關閉

到目前爲止一切正常。在我的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我有這樣的處置法:

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

當我打電話base.Dispose() - 方法通過「假」

base.Dispose(false); 

Excel中沒有意外關閉,當我關閉的WinForms-窗口,但是當我想以後關閉Excel,這是不可能的。我得到這個'Mouse-Wait-Symbol'並且不能做任何事情,所以我必須殺掉TaskManager中的Excel進程。

(我也嘗試使用新的WinForms項目真的什麼都不提供,在我原來的項目中,我做錯了什麼?我有完全一樣的行爲。)

所以我問題是:有誰知道我可以如何關閉我的WinForms-App,然後以「常規方式」關閉Excel。

非常感謝!

回答

0

嘗試在關閉winform之前將Application.UserControl屬性更改爲true。

「當對象的UserControl屬性爲False時,釋放對象的最後一個編程引用時釋放該對象。如果此屬性爲False,則Microsoft Excel會在會話中最後一個對象釋放時退出。 https://msdn.microsoft.com/library/office/ff841219.aspx

+0

不知道閹我明白你的權利。在調用我的app.Main()方法之前,我只需在我的VBA代碼中設置Application.UserControl = True。得到了同樣的結果.. Excel正在意外關閉...... – toniweser

+0

我現在無法測試,但我說的是在您的Main()方法中設置,而不是在vba代碼中。也許程序在運行時正在修改它,idk ... – Magnetron

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 
相關問題