VS2012 viktorina qidiruvi mahalliy .dll qulfini ochadi va qayta tiklash muvaffaqiyatsiz bo'ladi

Visual Studio 2012 ni C# va C ++/CLI .dll bilan hal qilish uchun foydalanayapman, C ++/CLI dll kabi mahalliy .dlls kabi boost kabi. C ++ kodi x64 sifatida tuziladi.

VSni ochganimda loyihani tozalab, qurishim mumkin.

Sinov sayg'og'idan foydalanib, sinovlarni bajarishim mumkin.

Sinovni bir marta sinovdan o'tkazish uchun testerni ishlatganimdan so'ng, men loyihani qayta tiklay olmayman. VS2012 viktorina Explorer mening C ++/CLI-dll-da qulfni saqlab qolgandek tuyuladi va u erda quyidagi xato yuzaga keladi:

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

Natijada, Test Explorer yordamida testlarni boshlaganimda, rivojlanishni davom ettirishimdan oldin VS2012 ni qayta ishga tushirish kerak. Shubhasiz bu barqaror rivojlanish jarayoni emas.

Sinov va qayta ishlanadigan ishlarni C# -texys bilan bajarish - bu muammo faqatgina mahalliy x64 kodidan foydalanadigan DLLlar bilan sodir bo'lishi mumkin.

Biroz ko'proq sinovdan so'ng, bu yerdagi yovuz odam vstest.executionengine.exe ekanligini aniqladim. (SysInternals dan) dastasini ishlatib, vstest.executionengine.exe .dll va cli-dll .pdb uchun qulflarga ega ekanligini ko'raman. Faqat boshqariladigan dll'leri uchun hech qanday qulf bo'lmaydi.

Viktorina tugallangach, C ++/Cli dllsidagi qulflarni chiqarish uchun Visual Studio test Explorerni qanday qilib olishim mumkin?

24
VS-2017da xuddi shunday muammoni boshqariladigan boshqarilmaydigan DLL bilan topdi.
qo'shib qo'ydi muallif Slobodan Savkovic, manba

6 javoblar

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
qo'shib qo'ydi

Bir nechta izlanishlar olib borilgandan so'ng, men bu yozuvni connect.microsoft.com . To'siqlarni echishda oxirgi maslahat bu muammoni hal qiladi, garchi bu yomon nopoklik bo'lsa.

C ++/CLI dll-ga oldindan tuzilgan voqealar sifatida quyidagilarni qo'shsam, qaytadan qura olaman:

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

Bu esa, vstest.executionengine.exe jarayonini o'ldiradi va shu bilan mening .dll faylidagi qulfni ozod qiladi.

9
qo'shib qo'ydi
Bu "hal" men uchun yomon ishlarga qaramay ishlaydi. Men faqat unga qaramaslikka harakat qilaman ...
qo'shib qo'ydi muallif rom99, manba

Mahalliy DLL fayllarini sinab ko'rishda bu muammo bilan ham tanishdim. O'rganishim (echim?) Topilgan testlar uchun DeploymentItemAttribute - bu odatda to'g'ri yoki yo'qligini bilmasdan emas, balki u men uchun ishlagan. Ularning ko'pchiligi (mening ishimda 6 ta bor edi) bo'lsa, bu bir oz og'riq, lekin yana bir marta bu boshqa testlarga nusxa ko'chirish va yopish oson edi.

Shunday qilib, mening unit test sinfi shunga o'xshash narsaga ega:

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

Men ham bu muammoni hal qilyapman va dastlab "taskkill" vaqtinchalik echimdan foydalandim, lekin VS2013 sozlamalaridan bir variantni qoqib qo'ydim. Bu muammoni yanada chiroyli tarzda hal qiladi:

Belgisidan tasdiq belgisini olib tashlang

Sinov ijro etuvchi vositasini sinov ishi bilan ishlashni davom eting

tanlangan

Tools/Options/Web Performance Test Tools

2
qo'shib qo'ydi
Men uchun ishlamayapti, lekin men veb-loyihani qurmayapman - bu variantni veb-loyihalarga xos deb hisoblaymanmi? Ehtimol, men boshqa joyda topolmaydigan variant bor.
qo'shib qo'ydi muallif rom99, manba
Ha, sinovdan foydalanish qidiruvi foydalanayapman va sinovlar (sqlite dlls) ishga tushirilgandan so'ng, ba'zi ikkilik fayllarda qulfni saqlab turadigan ko'rinadi. Vstest.console.exe buyruq qatorni vositasi bilan bir xil testlarni ishlatganda, hamma narsa kutilganidek ishlaydi va ikkilik fayllar qulflanmaydi. Vaqti-vaqti bilan testlar ham tezroq buyruq qatorni vositasi (yoki ehtimol testlar emas, balki sinov ishtirokchisi juda tez) yordamida tezroq ishlaydi. Ammo men ...
qo'shib qo'ydi muallif rom99, manba
Xo'sh, bu faqat "Test Explorer" dan foydalanishda muammolarni hal qiladi. Men C# dasturini sinovdan o'tkazyapman (veb-sayt bilan bog'liq hech narsa emas!) Va mening muammomni hal qildi. "Sinovlarni boshqarish vositasini" ishlatasizmi? Agar siz bo'lmasangiz, ehtimol bu "bin" ichidagi ikkilik chiqish fayllaridan birini qulflaydigan boshqa jarayon.
qo'shib qo'ydi muallif axeloide, manba

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.

Ushbu amalni tuzatish uchun, avval mavjud vstest.executionengine.exe faylini o'chirib tashlang, TFS Build agent tomonidan foydalanilgan foydalanuvchini kirgan foydalanuvchi bilan ishlashni o'zgartiring. TFS Build agent ish maydonida saqlangan yechimni oching va parametrni tanlang. Shundan so'ng, TFS Build agenti SUO fayli xuddi shu foydalanuvchi uchun bo'lgan "testni bajarish vositasini saqla" ni o'qiydi.

1
qo'shib qo'ydi
Ushbu parametr faqat VS ning yangi versiyalarida mavjud.
qo'shib qo'ydi muallif Wilbert, manba
Bilaman, faqat VS2013 (men kristal tozalangan joyda frodesto javobni ko'rsataman) va TFS masalasida ba'zi maslahatlar berardim. Lekin, ehtimol, men aniq chora ko'rmadim, javobimni tahrir qilaman.
qo'shib qo'ydi muallif Jon Ander Ortiz Durántez, manba

I had written a C# utility to be able to load and unload native libraries in here I used it in the test project as below. Since it unloads dll in Dispose, I don't get build errors.

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
qo'shib qo'ydi