2011-05-04 85 views
2

好吧,我有一個C#用戶界面,它使用C++ DLL。該DLL實際上是一個OpenGL/SDL遊戲。 遊戲結束後,它會回到C#UI。這一切都很好,據我所知,正確。C#加載C++ DLL - 出口問題

當我嘗試退出實際程序時出現問題。 C#表單關閉,但是很快會出現一個錯誤,這是非常不符合規定的。我認爲這與DLL有關,也許它仍然是開放的?如何確保DLL已正確關閉?或者你怎麼一起關閉它?

我打開DLL如下:提前

[DllImport("AsteroidGame.dll")] 
    public static extern int EntryPoint(); 

    private void rungame() 
    { 
      EntryPoint(); 
    } 

感謝。

編輯

錯誤只是說:

vshost32.exe已停止工作

+2

什麼是「不具說服力」的錯誤? =) – 2011-05-04 21:03:38

+0

它說: vshost32.exe已停止工作。 當我點擊此消息的確定後,它終於關閉。 – Noviz 2011-05-04 21:06:09

+2

您是否啓用了複選框 - >屬性 - >調試 - >啓用非託管代碼調試,如此鏈接所示:http://stackoverflow.com/questions/735621/vshost32-exe-crash-when-calling-unmanaged-dll – Johnv2020 2011-05-04 21:09:40

回答

5

DLL是由Windows中卸載該應用程序退出時。在這個過程中,你的DLL的靜態變量將被破壞。如果您的遊戲沒有正常結束,某些循環仍然將事件發送至一個靜態類,它反過來將它們路由到你的C#UI中,你可以得到這樣的錯誤。

首先,您應該檢查在退出C#UI之前是否調用了遊戲引擎的所有清理例程。如果這沒有幫助,則需要進一步調試到非託管代碼中。

Yorus, 阿洛伊斯·克勞斯

+0

是的,這似乎是發生了什麼。謝謝:) – Noviz 2011-05-04 21:19:38

+0

只是一個更新,這是什麼錯。 事實證明,我並沒有正確刪除我的遊戲狀態管理器。 – Noviz 2011-05-04 21:56:23

1

你不能卸載從C#外部組件,只能卸載應用程序域加載它。您可以創建一個應用程序域(http://msdn.microsoft.com/en-us/library/system.appdomain.aspx),然後從這裏加載C++程序集。當你完成遊戲時,卸載App域。

+0

嘿,謝謝你的回覆。我會檢查一下:) – Noviz 2011-05-04 21:19:50