문제

수년 동안 VB.NET에서 DEBUG 컴파일러 상수를 사용하여 콘솔에 메시지를 작성했습니다.나는 또한 비슷한 방식으로 System.Diagnostics.Debug.Write를 사용하고 있습니다.RELEASE가 빌드 옵션으로 사용되었을 때 컴파일러에서 이러한 모든 명령문을 생략하여 프로덕션 코드에서 디버그 명령문의 오버 헤드를 해제한다는 것은 항상 내 이해였습니다.최근에 Silverlight 2 Beta 2로 작업 할 때 Visual Studio가 실제로 공개 웹 사이트에서 실행중인 RELEASE 빌드에 연결되어 있고 컴파일되지 않은 것으로 간주하는 DEBUG 문을 표시했음을 발견했습니다!이제 내 첫 번째 성향은 내 환경에 문제가 있다고 가정하는 것이지만 System.Diagnostics.Debug 및 DEBUG 빌드 옵션에 대한 깊은 지식을 가진 사람에게 일반적으로 여기서 오해 할 수있는 내용을 물어보고 싶습니다.

도움이 되었습니까?

해결책

선호하는 방법은 컴파일러 지시문을 사용하지 않고 조건부 속성을 사용하여 디버그 호출을 래핑하는 것입니다.#ifs는 까다로워지고 이상한 빌드 문제로 이어질 수 있습니다.

조건부 속성 사용의 예는 다음과 같습니다 (C #에서는 있지만 VB.NET에서도 작동 함). 라코 디스

DEBUG 플래그를 설정하지 않고 컴파일하면 Debug.Write ()에서 발생했다고 가정 한대로 WriteDebug에 대한 모든 호출이 제거됩니다.

다른 팁

Debug.Write 메서드를 검사합니다.로 표시되어 있습니다. 라코 디스

속성.

ConditionalAttribute 에 대한 MSDN 도움말은 다음과 같이 설명합니다. <인용구>

컴파일러에게 메소드가 호출 또는 속성은 무시해야합니다. 지정된 조건부 컴파일 기호가 정의되어 있습니다 .

빌드 구성에 릴리스 또는 디버그 레이블이 있는지 여부는 중요하지 않습니다. 중요한 것은 DEBUG 기호가 정의되어 있는지 여부입니다.

내가하는 일은 내 클래스에 Debug 호출을 캡슐화하고 프리 컴파일러 지시문을 추가하는 것입니다. 라코 디스

DEBUG 컴파일러 기호를 사용하면 말했듯이 실제로 어셈블리에서 코드가 생략됩니다.

Release 모드에서 빌드 했더라도 System.Diagnostics.Debug.Write는 항상 연결된 디버거로 출력됩니다. MSDN 문서 : <인용구>

Listeners 컬렉션의 추적 수신기에 디버그 정보를 씁니다.

아무것도 출력하지 않으려면 Juan이 말한 것처럼 DEBUG 상수로 Debug.Write 호출을 래핑해야합니다. 라코 디스

저도 기사를 읽었고 DEBUG가 정의되지 않았을 때 System.Debug 함수에 선언 된 ConditionalAttribute로 인해 컴파일러가이 코드를 완전히 생략 할 수 있다고 믿게되었습니다. 나는 TRACE에 대해서도 똑같은 사실을 가정합니다. 즉, System.Diagnostics.Debug 함수에는 DEBUG 및 TRACE에 대한 ConditionalAttributes가 있어야합니다. 나는 그 가정에서 틀렸다. 별도의 Trace 클래스에는 동일한 기능이 있으며 TRACE 상수에 따라 ConditionalAttribute를 정의합니다.

System.Diagnostics.Debug에서 : _ 공용 공유 하위 쓰기 (_ 메시지 As String _ )

System.Diagnostics.Trace에서 : _ 공용 공유 하위 WriteLine (_ 메시지 As String _ )

그러면 System.Diagnostics.Debug (또는 system.Diagnostics.Trace) 문이 #IF DEBUG (또는 #IF TRACE) 영역에 포함 된 것처럼 실제로 컴파일에 포함되지 않는다는 원래 가정이 옳은 것 같습니다. .

하지만 여기에서도 여러분들로부터 배웠고 RELEASE 빌드 자체가이를 처리하지 않는다는 것을 확인했습니다. 적어도 약간 불안정한 Silverlight 프로젝트에서는 "고급 컴파일 옵션 ..."으로 들어가서 DEBUG가 정의되지 않았는지 확인해야합니다.

우리는 .NET 1.1 / VS2003에서 .NET 3.5 / VS2008로 점프했기 때문에이 중 일부는 다르게 작동했지만 2.0 / VS2005에서 변경되었을 수 있습니다.

디버그 정보를 컴파일 할 것인지 제거 할 것인지 선택하려면

프로젝트의 속성 창에 "빌드"탭으로 이동합니다.

올바른 구성 (Active / Release / Debug / All)을 선택하고 정보를 원하면 "DEBUG 상수"를 확인하십시오. 그렇지 않으면 선택 취소하십시오.

변경 사항 적용 및 재 구축

내 경험상 VB.NET에서 디버그와 릴리스를 선택해도 아무런 차이가 없습니다.두 구성 모두에 사용자 지정 작업을 추가 할 수 있지만 기본적으로는 동일하다고 생각합니다.

Release를 사용해도 System.Diagnostics.Debug.Write 문이 제거되지는 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top