2011-06-02 52 views
11

我已經遇到了一些問題,使用Visual Studio 2010的單元測試框架。目前,QTAgent32將在測試執行完成後保持對DLL的引用。QTAgent32.exe保留執行後打開的DLL句柄

有問題的DLL是圍繞某些本機C++代碼的C++/cli包裝。由包裝器公開的對象實際上從未被託管代碼分配。唯一的參考是在處理過程中進行最後的檢查,看看它是否在班級生命期間被設置。

If(_obj != null) 
{ 
    _obj.Dispose(); 
    _obj = null; 
} 

我知道這是事實,因爲如果我通過代碼並觀察調試器控制檯輸出,我可以看到該DLL的符號不加載,直到擊中如果(這是有道理的)。涉及的所有託管對象都實現了IDisposable,以確保所有本地對象都被注意避免內存泄漏。

基於這個問題:QTAgent32 Holding File Open我確保沒有文件流被明確地打開(包括控制檯),甚至沒有文件被使用,但問題仍然存在。我正在想什麼做什麼。

任何人都可以幫忙嗎?

TL; DR: QTAgent32.exe保留對從未實例化的C++/cli包裝的開放引用。

回答

0

它可能會在metadata only mode中打開DLL以搜索測試屬性。這不會觸發符號加載,但可能會鎖定文件。

11

我在使用Fortran DLL時遇到了同樣的問題。即使DLL函數完全爲空,問題仍然存在。

我仍然不知道問題是什麼,但一個簡單的解決方法是將QTAgent32進程指定爲項目中的預生成事件。

taskkill /f /im QTAgent32.exe 
exit 0 
+1

預構建的想法其實非常好。我可能不得不從現在開始使用它。謝謝。 – JMcCarty 2012-01-13 15:05:22

+1

在下面一行中添加'exit 0'以避免qtagent32未運行時出現錯誤。 – Christian 2012-05-22 10:15:35

+0

@Christian沒有幫助,當qtagent32沒有運行時,即使使用'exit 0'也會出錯。有什麼幫助,而是使用這個命令:'啓動taskkill/f/im QTAgent32.exe' – theV0ID 2014-01-07 16:32:32