VS2012 Тэставыя даследчык замкі роднай .dll, робячы пересборкі няўдачу

Я выкарыстоўваю Visual Studio 2012 года Для рашэння з C# і C ++/CLI .dll, з DLL C ++/CLI, які спасылаецца родныя .dlls, такія як імпульс. Код C ++ кампілюецца як x64.

Калі я адкрываю VS, я магу ачысціць і пабудаваць свой праект.

Выкарыстанне тэст-даследчык, я магу запусціць свае тэсты.

Як толькі я выкарыстаў тэставы правадыр для запуску тэстаў адзін раз, я не магу аднавіць праект. Здаецца, што VS2012 Test Explorer, падтрымлівае блакаванне на маім C ++/CLI-длл, і я атрымліваю наступнае паведамленне пра памылку:

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

У выніку гэтага, калі я запускаць тэсты з дапамогай Test Explorer, мне трэба перазапусціць VS2012, перш чым я змагу працягваць развівацца. Відавочна, што гэта не працэс ўстойлівага развіцця.

Тэставанне і аднаўленне працы без праблем з C# -Толькі DLLs - наколькі я магу сказаць, што праблема ўзнікае толькі з бібліятэк DLL, якія выкарыстоўваюць машынны код x64.

Пасля некаторага больш тэставання, я выявіў, што злыдзень тут vstest.executionengine.exe. З дапамогай дзяржальні (ад SysInternals), я бачу, што vstest.executionengine.exe трымае замкі для .dll і .pdb з CLI-бібліятэкі DLL. Ён не мае якіх-небудзь блакаванняў для кіраваных толькі бібліятэк DLL.

Як я магу атрымаць Visual Studio Test Explorer, каб вызваліць замкі на бібліятэкі DLL C ++/CLI пасля тэставых прабегаў завершана?

24
Знойдзена тое ж пытанне ў VS 2017 з спасылкавага некіравальных DLL.
дададзена аўтар Slobodan Savkovic, крыніца

6 адказы

In Visual Studio 2013 this problem can easily be fixed by unchecking the option "Keep Test Execution Engine Running" under "Test -> Test Settings" in the menu.

I found the answer in another post: vstest.executionengine.x86.exe not closing

30
дададзена

Пасля яшчэ некаторых пошукаў, я знайшоў гэты пост на connect.microsoft.com . Апошні намёк на абыходных шляхах сапраўды вырашае праблему, хоць гэта выродлівым секчы.

Я магу аднавіць, калі я дадам наступнае, як папярэдне пабудаваць падзеі майго C длл ++/CLI:

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

Гэта заб'е vstest.executionengine.exe працэс, тым самым вызваляючы замак на маёй .dll файл.

9
дададзена
Гэта «рашэнне» працуе для мяне, нягледзячы на ​​пачварнасць. Я проста стараюся не глядзець на яго ...
дададзена аўтар rom99, крыніца

Я таксама сутыкнуўся з гэтай праблемай падчас тэставання з удзелам родных бібліятэк DLL. Абыходны шлях (? Раствора) я знайшоў, каб дадаць DeploymentItemAttribute да тэстаў - не ўпэўнены, што гэта ў цэлым дакладна, але гэта, вядома, працаваў для мяне. Гэта трохі болю, калі ёсць іх шмат (у мяне было 6 у маім выпадку), але калісьці зроблена гэта было лёгка капіяваць і ўстаўляць у іншыя тэсты.

Так што мой блок тэставы клас выглядае прыкладна так:

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

Я таксама змагаюся з гэтай праблемай, і першапачаткова выкарыстаў «Taskkill» абыходны шлях, але я проста натыкнуўся на опцыю ў наладах VS2013, якія, здаецца, больш элегантна вырашыць гэтую праблему:

Зніміце галачку на

<�Моцны> Трымайце тэст выканання рухавік працуе паміж тэставых прагонаў

варыянт знайсці на

Tools/Options/Web Performance Test Tools

2
дададзена
Не працуе для мяне, але я не будаваць вэб-праект - я думаю, гэты варыянт з'яўляецца спецыфічным для вэб-праектаў? Можа быць, ёсць варыянт дзесьці яшчэ, што я не магу знайсці.
дададзена аўтар rom99, крыніца
Так, я выкарыстоўваю механізм выканання тэста, і, здаецца, трымаць блакіроўку на некаторых бінарныя файлы пасля таго, як тэсты запуску (SQLite DLL). Калі я бягу тыя ж тэсты, выкарыстоўваючы ўтыліту каманднага радка vstest.console.exe, усё працуе, як чакалася, і бінарныя файлы не заблякаваныя. Дарэчы тэсты таксама працаваць значна хутчэй з дапамогай інструмента каманднага радка (ці, магчыма, не самі тэсты, але тэст бягун значна хутчэй). Але я адцягнуўся ...
дададзена аўтар rom99, крыніца
Ну гэта вырашае праблемы толькі кожны раз, калі з дапамогай «Test Explorer». Я модульнае тэставанне C# прыкладанняў (не ўсе, вэб-звязаных!), І вырашыць маю праблему. Карыстаецеся Ці вы «тэст выканання рухавіка»? Калі вы не то, магчыма, гэта яшчэ адзін працэс, які блакавання любога з двайковых выходных файлаў у «бункеры».
дададзена аўтар axeloide, крыніца

Adding some stuff to the answer of @frodesto, (in case of VS2013), "Test>Test Setting>Keep Test Executin Engine running" configuration is stored in the user configuration (SUO file). This can be a bit nasty in case of this error happens in the TFS Build agent, beacause it uses a service default user.

Каб выправіць гэтую справу, першы забіць існуючы vstest.executionengine.exe, змяніць карыстальніка, які выкарыстоўваецца TFS зборкі агента для выканання з карыстальнікам вы ўвайшлі ў сістэму. Адкрыйце рашэнне, якое захоўваецца ў TFS зборкі агента працоўнай прасторы і адмяніце выбар. Пасля гэтага TFS зборкі агент будзе чытаць опцыю "захаваць тэставы механізм выканання» абумоўлена файл SUO для таго ж карыстальніка.

1
дададзена
Гэтая опцыя даступная толькі ў новых версіях VS.
дададзена аўтар Wilbert, крыніца
Я ведаю, я проста дадаць некаторыя намёкі ў выпадку VS2013 (я паказваў frodesto адказ, дзе гэта Cristal ясна) і TFS. Але, магчыма, я не ясна прыйсці, я буду рэдагаваць свой адказ.
дададзена аўтар Jon Ander Ortiz Durántez, крыніца

Я напісаў C# ўтыліту, каб мець магчымасць загружаць і выгружаць ўласныя бібліятэкі ў тут Я выкарыстаў яго ў тэставым праекце, як паказана ніжэй. Бо выгружае DLL ў Dispose, я не атрымліваю памылкі пабудовы.

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


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

       //Use methods in impl
        int i = impl.NativeMethod();
        //...
    }
}
1
дададзена