IT

DLL이 디버그 또는 릴리스 빌드인지 확인 방법 (.NET)

lottoking 2020. 8. 16. 21:28
반응형

DLL이 디버그 또는 릴리스 빌드인지 확인 방법 (.NET) [중복]


가능성 :
.NET 응용 프로그램이 DEBUG 또는 RELEASE 모드에서 확인하는 방법은 무엇입니까?

나는 시도하기 전에 확신하지만 Google과 SO 검색이 실패했습니다.

DLL이 릴리스 빌드인지 디버그 빌드인지 어떻게 할 수 있습니까?


수행하는 가장 좋은 방법은이를 수행 한 어셈블리 자체를 확인하는 것입니다. '.NET 어셈블리 정보'라는 발견이 매우 유용한 도구가 여기 로템 블룸으로는. 설치하면 .dll 파일과 연결되어 자체적으로 그래픽 적으로 설치됩니다. 설치 후 어셈블리를 두 번 클릭하여 열면 아래 스크린 샷에 있습니다.대로 어셈블리 세부 정보가 제공됩니다. 디버그 여부를 확인할 수 있습니다.

도움이 되셨기를 바랍니다 ..


IMHO, 위의 응용 프로그램은 실제로 오해의 소지가 있습니다. 코드가 최적화를 위해 JIT 최적화를 위해 제거하고 독립적 인 IsJITTrackingEnabled 만 찾습니다.

DebuggableAttribute는 릴리스 모드에서 선택하고 DebugOutput을 "none"이외의 값으로 선택하면 존재합니다.

또한 "디버그"와 "릴리스"의 의미를 정확히 정의해야합니다 .

앱이 코드 최적화로 구성 의미 의미? VS / JIT 디버거를 수있는 것이 뜻입니까? DebugOutput을 생성한다는 의미입니까? DEBUG 상수를 정의한다는 의미입니까? System.Diagnostics.Conditional () 특성을 사용하여 조건부로 방법을 사용할 수 있습니다.

IMHO, 누군가 어셈블리가 "디버그"인지 "릴리스"인지 여부 코드가 최적화되었는지 여부를 의미합니다.

Sooo, 수동으로 또는 프로그래밍 방식으로 수행 하시겠습니까?

수동 : 어셈블리의 메타 데이터에 대한 DebuggableAttribute 비트 마스크 값을 확인해야합니다. 방법은 다음과 가변합니다.

  1. ILDASM에서 어셈블리 열기
  2. 매니페스트 열기
  3. DebuggableAttribute 비트 마스크를 사용합니다. DebuggableAttribute가 확실히 최적화 된 어셈블리입니다.
  4. 존재하는 경우 4 개의 바이트를 사용합니다. '0'이면 JIT 최적화 된 것입니다. 그 밖의 것은 다음과 같습니다.

// 메타 데이터 버전 : v4.0.30319 .... // .custom instance void [mscorlib] System.Diagnostics.DebuggableAttribute ::. ctor (값 유형 [mscorlib] System.Diagnostics.DebuggableAttribute / DebuggingModes) = (01 00 02 00 00 00 00 00)

프로그래밍 방식 : 코드가 JITOptimized인지 프로그래밍 방식으로 알고 싶다고 가정하면 올바른 구현은 다음과 같습니다.

object[] attribs = ReflectedAssembly.GetCustomAttributes(typeof(DebuggableAttribute), 
                                                        false);

// If the 'DebuggableAttribute' is not found then it is definitely an OPTIMIZED build
if (attribs.Length > 0)
{
    // Just because the 'DebuggableAttribute' is found doesn't necessarily mean
    // it's a DEBUG build; we have to check the JIT Optimization flag
    // i.e. it could have the "generate PDB" checked but have JIT Optimization enabled
    DebuggableAttribute debuggableAttribute = attribs[0] as DebuggableAttribute;
    if (debuggableAttribute != null)
    {
        HasDebuggableAttribute = true;
        IsJITOptimized = !debuggableAttribute.IsJITOptimizerDisabled;
        BuildType = debuggableAttribute.IsJITOptimizerDisabled ? "Debug" : "Release";

        // check for Debug Output "full" or "pdb-only"
        DebugOutput = (debuggableAttribute.DebuggingFlags & 
                        DebuggableAttribute.DebuggingModes.Default) != 
                        DebuggableAttribute.DebuggingModes.None 
                        ? "Full" : "pdb-only";
    }
}
else
{
    IsJITOptimized = true;
    BuildType = "Release";
}

내 블로그 에서이 구현을 제공했습니다.

어셈블리가 디버그인지 릴리스인지 확인하는 방법

참고 URL : https://stackoverflow.com/questions/798971/how-to-identify-if-the-dll-is-debug-or-release-build-in-net

반응형