Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 6개 있습니다.)
오류 유형: 534. mstest.exe 실행 시 "Visual Studio Enterprise is required to execute the test." 오류
; https://www.sysnet.pe.kr/2/0/11886

개발 환경 구성: 438. mstest, QTAgent의 로그 파일 설정 방법
; https://www.sysnet.pe.kr/2/0/11889

개발 환경 구성: 439. "Visual Studio Enterprise is required to execute the test." 메시지와 관련된 코드 기록
; https://www.sysnet.pe.kr/2/0/11890

오류 유형: 539. mstest 실행 시 "The directory name is invalid." 오류 발생
; https://www.sysnet.pe.kr/2/0/11902

오류 유형: 575. mstest.exe - System.Resources.MissingSatelliteAssemblyException: The satellite assembly named "Microsoft.VisualStudio.ProductKeyDialog.resources.dll, ..."
; https://www.sysnet.pe.kr/2/0/12044

오류 유형: 576. mstest.exe 실행 시 "Visual Studio Enterprise is required to execute the test." 오류 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/12045




mstest.exe 실행 시 "Visual Studio Enterprise is required to execute the test." 오류 - 두 번째 이야기

지난 글에서,

mstest.exe 실행 시 "Visual Studio Enterprise is required to execute the test." 오류
; https://www.sysnet.pe.kr/2/0/11886

분명히 Enterprise 버전인데도 제품키를 입력해야만 mstest.exe가 동작하는 것에 대한 설명을 했습니다. 아무래도 마이크로소프트 측의 버그 같은데 아쉽게도 최근 비주얼 스튜디오의 새 프로젝트 창을 보면,

mstest_loadtest_1.png

"Deprecated"라고 나온 걸로 봐서 관련 테스트 프로젝트를 더 이상 신경 쓰지 않는 듯한 모습을 보이고 있습니다. 결국 저 동작이 수정될 가능성이 그다지 높지 않다는 것입니다.




혹시 그럼, 저 동작을 우회할 수는 없을까요? 이를 위해 해당 라이선스 체크가 발생하는 코드를 추적해 보면,

"Visual Studio Enterprise is required to execute the test." 메시지와 관련된 코드 기록
; https://www.sysnet.pe.kr/2/0/11890

결국 다음의 코드에서 IsLicenseGood에 따라 결정되는 것을 볼 수 있습니다.

private void UpdateLicensingInformation(IVsClientRights clientRights)
{
    if (clientRights == null)
    {
        WebTestLoadTrace.Error("LicenseHandler.UpdateLicensingInformation(): unable to fetch clientRights ");
    }
    else if (!clientRights.IsLicenseGood)
    {
        WebTestLoadTrace.Error("LicenseHandler.UpdateLicensingInformation(): clientrights' license is not valid.");
    }
    else
    {
        this.AvailableFeatures = 4;
        _VSLicenseType licenseType = (_VSLicenseType) clientRights.LicenseType;
        this.IsLicensedForAllLoadTestFeatures = ((this.IsLicensedForLoadTest && (licenseType != _VSLicenseType.VSLICTYPE_UNKNOWN)) && ((licenseType != _VSLicenseType.VSLICTYPE_TrialPID) && (licenseType != _VSLicenseType.VSLICTYPE_VSExtensionTrial))) && (licenseType != _VSLicenseType.VSLICTYPE_PrereleaseTrialPID);
        WebTestLoadTrace.Verbose("LicenseHandler.UpdateLicensingInformation(): licenseType: " + licenseType);
        if (this.IsLicensedForAllLoadTestFeatures)
        {
            this.AvailableFeatures |= 8;
            this.AvailableFeatures |= 0x20;
        }
    }
}

그렇다면 이 코드를 profiler 기술을 이용해,

라이선스까지도 뛰어넘는 .NET Profiler
; https://www.sysnet.pe.kr/2/0/1046

다음과 같은 식으로 IsLicenseGood의 IL 코드를 무조건 1을 반환하도록 변경하면 됩니다.

vector<BYTE> ilCodes;

ilCodes.push_back(CEE_LDC_I4_1);
ilCodes.push_back(CEE_RET);

IMAGE_COR_ILMETHOD ilHeader;
ilHeader.Tiny.Flags_CodeSize = (BYTE)((ilCodes.size() << 2) | CorILMethod_TinyFormat);

size_t allocationSize = ilCodes.size() + sizeof(ilHeader.Tiny);

BYTE* pAllocated = (BYTE*)pMalloc->Alloc((ULONG)allocationSize);

BYTE* pBytes = pAllocated;
memcpy(pBytes, &ilHeader.Tiny, sizeof(ilHeader.Tiny));
pBytes += sizeof(ilHeader.Tiny);

memcpy(pBytes, ilCodes.data(), ilCodes.size());
pBytes += ilCodes.size();

m_pICorProfilerInfo->SetILFunctionBody(moduleId, methodToken, (LPCBYTE)pAllocated);

이후, 비교를 위해 예전 그대로 실행해 보면 "Visual Studio Enterprise is required to execute the test." 오류가 발생하지만,

C:\temp> mstest /testcontainer:loadtest1.loadtest
Microsoft (R) Test Execution Command Line Tool Version 16.0.28326.58
Copyright (c) Microsoft Corporation. All rights reserved.

Loading loadtest1.loadtest...
Starting execution...

Results               Top Level Tests
-------               ---------------
Error                 loadtest1.loadtest
0/1 test(s) Passed, 1 Error

Summary
-------
Test Run Warning.
  Error  1
  --------
  Total  1
Results file:  C:\temp\TestResults\%USERNAME%_TESTPC 2019-05-23 23_30_15.trx
Test Settings: Default Test Settings

Run has the following issue(s):
Visual Studio Enterprise is required to execute the test.

V, 11892, 1, 2019/05/23, 08:54:16.573, TESTPC\mstest, WebLoadTestAdapter: LicenseHandler.InitializeLoadTestLicenseInfo(): skuEdition: VSEDITION_Ultimate
E, 11892, 1, 2019/05/23, 08:54:16.990, TESTPC\mstest, WebLoadTestAdapter: LicenseHandler.UpdateLicensingInformation(): clientrights' license is not valid.

profiler를 등록한 다음,

C:\temp> SET COR_ENABLE_PROFILING=1
C:\temp> SET COR_PROFILER={...}

다시 실행해 보면 정상적으로 loadtest에 대한 시나리오를 수행하게 될 것입니다.

(혹시나, 저 동작이 마이크로소프트의 버그가 아니라 의도된 라이선스 수행 과정일 수 있으므로 이 글에 대한 바이너리나 전체 소스 코드는 공개하지 않습니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 10/27/2019]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  [127]  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
2879정성태3/3/201526666개발 환경 구성: 259. Visual Studio 없이 Visual C++ 컴파일하는 방법
2878정성태2/28/201527490.NET Framework: 503. == 연산자보다는 Equals 메서드의 호출이 더 권장됩니다. [3]파일 다운로드1
2877정성태2/28/201521736.NET Framework: 502. 연산자 재정의(operator overloading)와 메서드 재정의(method overriding)의 다른 점 - 가상 함수 호출 여부 [3]파일 다운로드1
2876정성태2/27/201524211VS.NET IDE: 98. IntegraStudio - Visual Studio에서 Java 프로그램 개발
2875정성태2/26/201522810디버깅 기술: 72. Visual Studio 2013에서의 sos.dll 사용 제한
2874정성태2/26/201519565디버깅 기술: 71. windbg + 닷넷 디버깅 (2) - null 체크 패턴
2873정성태2/25/201537016.NET Framework: 501. FtpWebRequest 타입을 이용해 FTP 파일 업로드 [4]파일 다운로드1
2872정성태2/25/201521185디버깅 기술: 70. windbg + 닷넷 디버깅 (1) - 배열 인덱스 사용 패턴
2871정성태2/24/201525184개발 환경 구성: 258. 윈도우 8.1에서 방화벽과 함께 FTP 서버 여는 (하지만, 권장하지 않는) 방법 [1]
2870정성태2/24/201526302개발 환경 구성: 257. 윈도우 8.1에서 방화벽과 함께 FTP 서버 여는 방법
2869정성태2/23/201520291.NET Framework: 500. struct로 정의한 값 형식(Value Type)의 경우 Equals 재정의를 권장합니다.파일 다운로드1
2868정성태2/23/201524789VS.NET IDE: 97. Visual C++ 프로젝트 디버깅 시에 Step-Into(F11) 동작이 원치 않는 함수로 진입하는 것을 막는 방법 [2]
2867정성태2/23/201518442오류 유형: 273. File History - Failed to initiate user data backup (error 80070005)
2866정성태2/23/201520300오류 유형: 272. WAT080 : Failed to locate the Windows Azure SDK. Please make sure the Windows Azure SDK v2.1 is installed.
1868정성태2/20/201517611오류 유형: 271. The type '...' cannot be used as type parameter 'TContext' in the generic type or method 'System.ServiceModel.DomainServices.EntityFramework.LinqToEntitiesDomainService&lt;T&gt;
1866정성태2/20/201518510오류 유형: 270. "aspnet_regiis -i" 실행 시 0x00000006 오류 해결 방법
1865정성태2/20/201519829.NET Framework: 499. 특정 닷넷 프레임워크 버전 이후부터 제공되는 타입을 사용해야 한다면?
1864정성태2/18/201524815.NET Framework: 498. C#으로 간단하게 만들어 본 ASCII Art 프로그램 [2]파일 다운로드1
1862정성태2/18/201528661.NET Framework: 497. .NET Garbage Collection에 대한 정리 [6]
1861정성태2/18/201524012.NET Framework: 496. 마우스 커서가 놓인 지점의 문자열 얻는 방법 [1]파일 다운로드1
1860정성태2/18/201523845.NET Framework: 495. CorElementType의 요소 값 설명파일 다운로드1
1859정성태2/17/201524236Windows: 106. 컴퓨터를 재부팅하면 절전(Power Saver) 전원 모드로 돌아가는 경우
1858정성태2/16/201534259Windows: 105. 자동으로 로그아웃/잠김 화면 상태로 전환된다면? [2]
1857정성태2/16/201522264.NET Framework: 494. 값(struct) 형식의 제네릭(Generic) 타입이 박싱되는 경우의 메타데이터 토큰 값파일 다운로드1
1856정성태2/15/201521248.NET Framework: 493. TypeRef 메타테이블에 등록되는 타입의 조건파일 다운로드1
1855정성태2/10/201520795개발 환경 구성: 256. WebDAV Redirector - Sysinternals 폴더 연결 시 "The network path was not found" 오류 해결 방법
... 121  122  123  124  125  126  [127]  128  129  130  131  132  133  134  135  ...