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

닷넷 6 프로젝트의 "Conditional compilation symbols" 기본값 오류

Visual Studio 2022의 현재 버전(17.2.6)에서는 프로젝트 속성의 "Conditional compilation symbols" 값을 보면 다음과 같이 나옵니다.

$(DefineConstants)TRACE

사실 값 자체에는 오류가 있지만, 이 상태에서는 프로그램에 아무런 영향을 끼치지는 않습니다. 실제로 다음과 같이 코드를 작성하고,

using System.Diagnostics;

Trace.WriteLine("TEST_TRACE");
Debug.WriteLine("TEST_DEBUG");

빌드하면 "Output" 창에 다음과 같이 "TEST_TRACE", "TEST_DEBUG"가 정상적으로 출력됩니다.

invalid_initial_cond_value_1.png




저 잘못된 초깃값의 문제는, Symbols 값을 편집할 때 발생합니다. 가령 다음과 같이 "TEST"를 추가하고,

invalid_initial_cond_value_2.png

프로젝트 설정을 저장 후 다시 빌드를 하면 이제는 출력 결과가 이렇게 나옵니다.

invalid_initial_cond_value_3.png

버그죠? 분명히 "TEST_TRACE"도 함께 나왔어야 합니다. 이렇게 나오는 이유를, 위의 화면에서 중간의 파란색 원 영역을 보면 나옵니다.

Debug - TRACETRACE;DEBUG;NET;NET6_0;NETCOREAPP
Release - TRACETRACE;RELEASE;NET;NET6_0;NETCOREAPP

뭐가 잘못인지 아시겠죠? ^^ 그렇습니다. "$(DefineConstants)"에는 이미 "TRACE"가 포함돼 있습니다. 문제는 마지막에 세미콜론을 포함하지 않았다는 것과, Visual Studio가 제공하는 기본값에는 다시 그것을 "TRACE"와 연결해서 제공한다는 점입니다.
그럼, 왜 처음부터 이것이 문제가 되지 않았을까요?

왜냐하면, 기본 상태에서는 비주얼 스튜디오가 기본값을 그렇게 보여줄 뿐 실제 빌드 프로세스에는 반영하지 않기 때문입니다. 하지만, 사용자가 편집을 한 순간부터 csproj에는 그것이 반영되고,

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>$(DefineConstants)TRACE;TEST</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <DefineConstants>$(DefineConstants)TRACE;TEST</DefineConstants>
  </PropertyGroup>
</Project>

이후부터 빌드에 반영되기 때문에 빌드 결과에도 영향을 미치는 것입니다. 따라서 이 문제를 해결하려면 비주얼 스튜디오가 제공하는 기본값을 이런 식으로 바꾸면 됩니다.

// 세미콜론을 추가하거나,
$(DefineConstants);TRACE;TEST

// 어차피 TRACE를 포함하므로 지우거나,
$(DefineConstants);TEST

그럼 다시 정상적인 출력을 얻을 수 있습니다.

invalid_initial_cond_value_4.png




참고로, 이에 대한 이슈가 이미 있었습니다.

Can't remove "TRACE" from conditional compilation symbols
; https://developercommunity.visualstudio.com/t/Cant-remove-TRACE-from-conditional-co/1617120

제가 보기에는 문제를 충분히 잘 설명했는데도, 마이크로소프트의 "Luna Mi"라는 직원이 "without the additional information requested."라는 요구를 하면서 이슈를 "Closed" 시켜버렸습니다. ^^;

암튼, 그래서 좀 더 촘촘하게 설명을 해 이슈를 다시 열었는데,

Invalid initial "Conditional compilation symbols" values (Visual Studio 2022 17.2.6)
; https://developercommunity.visualstudio.com/t/Invalid-initial-Conditional-compilation/10102611

결과는 좀 지켜봐야겠습니다. ^^




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







[최초 등록일: ]
[최종 수정일: 7/24/2022]

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

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  22  23  24  25  26  27  [28]  29  30  ...
NoWriterDateCnt.TitleFile(s)
13237정성태1/30/202314307.NET Framework: 2091. C# - 웹 사이트가 어떤 버전의 TLS/SSL을 지원하는지 확인하는 방법
13236정성태1/29/202313062개발 환경 구성: 663. openssl을 이용해 인트라넷 IIS 사이트의 SSL 인증서 생성
13235정성태1/29/202312552개발 환경 구성: 662. openssl - 윈도우 환경의 명령행에서 SAN 적용하는 방법
13234정성태1/28/202314968개발 환경 구성: 661. dnSpy를 이용해 소스 코드가 없는 .NET 어셈블리의 코드를 변경하는 방법 [1]
13233정성태1/28/202316139오류 유형: 840. C# - WebClient로 https 호출 시 "The request was aborted: Could not create SSL/TLS secure channel" 예외 발생
13232정성태1/27/202312055스크립트: 43. uwsgi의 --processes와 --threads 옵션
13231정성태1/27/202311283오류 유형: 839. python - TypeError: '...' object is not callable
13230정성태1/26/202312026개발 환경 구성: 660. WSL 2 내부로부터 호스트 측의 네트워크로 UDP 데이터가 1개의 패킷으로만 제한되는 문제
13229정성태1/25/202313925.NET Framework: 2090. C# - UDP Datagram의 최대 크기
13228정성태1/24/202314466.NET Framework: 2089. C# - WMI 논리 디스크가 속한 물리 디스크의 정보를 얻는 방법 [2]파일 다운로드1
13227정성태1/23/202313370개발 환경 구성: 659. Windows - IP MTU 값을 바꿀 수 있을까요? [1]
13226정성태1/23/202312329.NET Framework: 2088. .NET 5부터 지원하는 GetRawSocketOption 사용 시 주의할 점
13225정성태1/21/202311665개발 환경 구성: 658. Windows에서 실행 중인 소켓 서버를 다른 PC 또는 WSL에서 접속할 수 없는 경우
13224정성태1/21/202312164Windows: 221. Windows - Private/Public/Domain이 아닌 네트워크 어댑터 단위로 방화벽을 on/off하는 방법
13223정성태1/20/202312070오류 유형: 838. RDP 연결 오류 - The two computers couldn't connect in the amount of time allotted
13222정성태1/20/202311931개발 환경 구성: 657. WSL - DockerDesktop.vhdx 파일 위치를 옮기는 방법
13221정성태1/19/202312125Linux: 57. C# - 리눅스 프로세스 메모리 정보파일 다운로드1
13220정성태1/19/202311797오류 유형: 837. NETSDK1045 The current .NET SDK does not support targeting .NET ...
13219정성태1/18/202311424Windows: 220. 네트워크의 인터넷 접속 가능 여부에 대한 판단 기준
13218정성태1/17/202311282VS.NET IDE: 178. Visual Studio 17.5 (Preview 2) - 포트 터널링을 이용한 웹 응용 프로그램의 외부 접근 허용
13217정성태1/13/202312004디버깅 기술: 185. windbg - 64비트 운영체제에서 작업 관리자로 뜬 32비트 프로세스의 덤프를 sos로 디버깅하는 방법
13216정성태1/12/202311912디버깅 기술: 184. windbg - 32비트 프로세스의 메모리 덤프인 경우 !peb 명령어로 나타나지 않는 환경 변수
13215정성태1/11/202314942Linux: 56. 리눅스 - /proc/pid/stat 정보를 이용해 프로세스의 CPU 사용량 구하는 방법 [1]
13214정성태1/10/202313844.NET Framework: 2087. .NET 6부터 SourceGenerator와 통합된 System.Text.Json [1]파일 다운로드1
13213정성태1/9/202312199오류 유형: 836. docker 이미지 빌드 시 "RUN apt install ..." 명령어가 실패하는 이유
13212정성태1/8/202313572기타: 85. 단정도/배정도 부동 소수점의 정밀도(Precision)에 따른 형변환 손실
... 16  17  18  19  20  21  22  23  24  25  26  27  [28]  29  30  ...