2013-05-24 10 views
24

Używam Visual Studio 2012 do rozwiązania z C# i C++/CLI .dll, z dll C++/CLI odwołującego się do rodzimych .dll takich jak boost. Kod C++ jest skompilowany jako x64.VS2012 Eksplorator testów blokuje natywny plik .dll, powodując niepowodzenie odbudowy.

Po otwarciu VS mogę wyczyścić i zbudować swój projekt.

Korzystając z eksploratora testów, mogę uruchomić moje testy.

Gdy tylko użyję testowego eksploratora do przeprowadzenia testów raz, nie mogę odbudować projektu. Wydaje się, że VS2012 testowania Explorer utrzymuje blokadę na moim C++/CLI-dll, a tam pojawia się następujący błąd:

LNK1104: cannot open file 'C:\Dev\LockExample\bin\Debug\cli.dll' 

W wyniku tego, kiedy mam uruchomić testy testem Explorer, muszę aby ponownie uruchomić VS2012, zanim będę mógł dalej się rozwijać. Oczywiście nie jest to proces zrównoważonego rozwoju.

Testowanie i przebudowywanie działa bez problemu z C# -only dll - o tyle, na ile mogę powiedzieć, że problem występuje tylko z bibliotekami DLL, które korzystają z natywnego kodu x64.

Po kilku kolejnych testach odkryłem, że złoczyńcą jest tutaj vstest.executionengine.exe. Używając uchwyt (z SysInternals), widzę, że vstest.executionengine.exe przechowuje blokady dla .dll i .pdb z cli-dll. Nie ma żadnych blokad dla bibliotek DLL tylko do zarządzania.

Jak mogę uruchomić Eksploratora testów Visual Studio, aby zwolnić blokady w bibliotekach C++/Cli po zakończeniu testów?

+0

Znaleziono ten sam problem w VS 2017 z odwołaniem niezarządzanego DLL. –

Odpowiedz

9

Po dalszych poszukiwaniach znalazłem this post on connect.microsoft.com. Ostatnia wskazówka w rozwiązaniu problemu rozwiązuje problem, chociaż jest to brzydki hack.

mogę odbudować jeśli dodać następujące jako wstępnie zbudować zdarzenia do mojego C++/CLI DLL:

taskkill /F /IM vstest.executionengine.exe /FI "MEMUSAGE gt 1" 
taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1" 

To zabije proces vstest.executionengine.exe, uwalniając w ten sposób blokadę na mojej .dll plik.

+1

To "rozwiązanie" działa dla mnie, pomimo brzydoty. Spróbuję po prostu nie patrzeć na to ... – rom99

2

Mam również zwalczaniu tego problemu i początkowo używane „taskkill” obejście, ale ja po prostu potknął się opcja w ustawieniach VS2013, który wydaje się bardziej elegancko rozwiązać ten problem:

usuń zaznaczenie znak na

Przechowywać testowy silnik na wykonanie testu przebiega między

opcję znaleźć na

Narzędzia/Opcje/Performance WWW Narzędzia testowe

+0

Nie działa dla mnie, ale nie buduję projektu internetowego - domyślam się, że ta opcja dotyczy projektów internetowych? Może jest taka opcja w innym miejscu, której nie mogę znaleźć. – rom99

+0

To rozwiązuje tylko problemy przy użyciu "Eksploratora testów". Używam aplikacji C# do testowania jednostkowego (nie jest to żadna strona internetowa!) I to rozwiązało mój problem. Czy używasz "silnika wykonywania testów"? Jeśli tak nie jest, być może jest to kolejny proces, który blokuje dowolny z plików wyjściowych binarnych w "bin". – axeloide

+0

Tak, używam silnika wykonywania testów i wydaje się trzymać blokadę pewnych plików binarnych po uruchomieniu testów (sqlite dlls). Po uruchomieniu tych samych testów przy użyciu narzędzia wiersza poleceń vstest.console.exe wszystko działa zgodnie z oczekiwaniami, a pliki binarne nie są zablokowane. Nawiasem mówiąc, testy działają również DUŻO szybciej za pomocą narzędzia wiersza poleceń (lub może nie same testy, ale biegacz testowy jest znacznie szybszy). Ale cofam ... – rom99

3

Ja również napotkał ten problem podczas testowania w odniesieniu do natywnych bibliotek DLL. Obejście (rozwiązanie?), Które znalazłem, to dodanie DeploymentItemAttribute do testów - nie jestem pewien, czy to generalnie prawda, ale z pewnością zadziałało. To trochę problem, jeśli jest ich dużo (w moim przypadku było ich 6), ale po ich wykonaniu łatwo było skopiować i wkleić do innych testów.

Więc moja klasa testów jednostkowych wygląda mniej więcej tak:

[TestClass] 
public class TestMyClass 
{ 
    [TestMethod] 
    [DeploymentItem("firstnative.dll")] 
    [DeploymentItem("secondnative.dll")] 
    public void TestMyMethod() 
    { 
     //Code which (indirectly) uses the above native dlls. 
    } 
} 
1

I napisał # użyteczność C, aby być w stanie załadować i rozładować bibliotek natywnych w here Używałem go w ramach projektu badawczego, jak poniżej. Ponieważ zwalnia dll w Dispose, nie dostaję błędów kompilacji.

public interface INativeCrypto : INativeImport 
{ 
    [ImportFunction("mynative.dll"] 
    int NativeMethod(); 
} 


[TestClass] 
public class UnitTest1 
{ 
    public void TestMethod1() 
    { 
     INativeCrypto impl = NativeImport.Create<INativeCrypto>(""); 

     // Use methods in impl 
     int i = impl.NativeMethod(); 
     //... 
    } 
} 
29

W Visual Studio 2013 problem ten może być łatwo ustalony przez odznaczając opcję „Keep badania jezdnego Execution Engine” w ramach „testu -> Ustawienia testowe” w menu.

znalazłem odpowiedź w innym poście: vstest.executionengine.x86.exe not closing

1

dodając kilka rzeczy do odpowiedzią @frodesto, (w przypadku VS2013), „Test> Ustawienia testowania> Zachowaj test poleceni Silnik działa” konfiguracja jest przechowywana w konfiguracji użytkownika (plik SUO). Może to być trochę nieprzyjemne w przypadku, gdy ten błąd wystąpi w agencie budowania TFS, ponieważ używa on domyślnego użytkownika usługi.

Aby naprawić ten przypadek, najpierw należy zabić istniejący plik vstest.executionengine.exe, zmodyfikować użytkownika używanego przez agenta TFS Build do wykonania z użytkownikiem, na którym się zalogowano. Otwórz rozwiązanie przechowywane w przestrzeni roboczej agenta Build TFS i odznacz opcję. Następnie agent TFS Build odczyta opcję "keep testing execution engine", ponieważ plik SUO jest dla tego samego użytkownika.

+0

Ta opcja jest dostępna tylko w nowych wersjach VS. – Wilbert

+0

Wiem, dodałem tylko wskazówki w przypadku VS2013 (wskazywałem odpowiedź frodesto tam, gdzie jest krystalicznie czysta) i TFS. Ale być może nie było to jasne, będę edytować odpowiedź. –

Powiązane problemy