Microsoft MVP성태의 닷넷 이야기
.NET Framework: 2098. dotnet build에 /p 옵션을 적용 시 유의점 [링크 복사], [링크+제목 복사],
조회: 14609
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

dotnet build에 /p 옵션을 적용 시 유의점

csproj를 보면 "PropertyGroup"의 자식으로 다양한 Property를 정의할 수 있는데요,

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

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

</Project>

이런 옵션들을 "dotnet build" 명령행에서 "/p" 인자를 이용해 직접 제어하는 것이 가능합니다. 예를 들어, 다음과 같이 코딩한 경우,

class Program
{
    static unsafe void Main(string[] args)
    {
        int n = 5;
        int* p = &n;

        Console.WriteLine(*p);
    }
}

기본 csproj 상태로는 "error CS0227: Unsafe code may only appear if compiling with /unsafe" 컴파일 오류가 발생하지만, csproj에 이렇게 AllowUnsafeBlocks 옵션을 설정하거나,

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

    <PropertyGroup>
        ...[생략]...

        <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
    </PropertyGroup>

</Project>

dotnet build의 경우 동일한 이름의 옵션을 다음과 같이 /p로 연결해서 빌드하면 정상적으로 실행됩니다.

c:\temp\ConsoleApp1\ConsoleApp1> dotnet build /p:AllowUnsafeBlocks=true

c:\temp\ConsoleApp1\ConsoleApp1> dotnet run
5




위에서 설명한 옵션 같은 경우에는, 그 옵션이 적용되지 않으면 컴파일 오류가 발생하기 때문에 적용 여부를 바로 알아챌 수 있는데요, 그렇지 않은 경우, 가령 CheckForOverflowUnderflow 옵션 등은 dotnet build 시 주의해야 합니다.

역시 간단하게 예를 들어볼까요? ^^

short c = -32768;
c--;
Console.WriteLine(c); // 32767

csproj에 CheckForOverflowUnderflow 옵션을 주고 위의 소스 코드를 빌드하면,

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

    <PropertyGroup>
        ...[생략]...

        <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
    </PropertyGroup>

</Project>

실행 시 overflow 예외가 발생합니다.

Unhandled exception. System.OverflowException: Arithmetic operation resulted in an overflow.
   at Program.<Main>$(String[] args) in C:\Users\SeongTae Jeong\Dropbox\articles\checked_dotnet_build\ConsoleApp1\ConsoleApp1\Program.cs:line 2

그런데, 이 과정을 (csproj의 CheckForOverflowUnderflow 옵션을 삭제하고) dotnet build로 바꿔보면 어떻게 될까요?

c:\temp\ConsoleApp1\ConsoleApp1> dotnet build
c:\temp\ConsoleApp1\ConsoleApp1> dotnet run
32767

일단 정상적으로 나왔습니다. 그런데, 위의 빌드에 이어서 /p 옵션을 주고 빌드하면,

c:\temp\ConsoleApp1\ConsoleApp1> dotnet build /p:CheckForOverflowUnderflow=true
c:\temp\ConsoleApp1\ConsoleApp1> dotnet run
32767

마치 옵션 값을 무시하는 듯, overflow 예외가 발생하지 않습니다. 이유는 간단합니다. 소스 코드 또는 csproj의 내용이 바뀌어야 재빌드를 하는데, 단순히 명령행 옵션만 바뀌었기 때문에 재빌드를 안 한 것입니다.

재미있는 건, .\bin\Debug\net7.0 디렉터리의 내용을 모두 삭제하고 다시 "dotnet build ..."를 해도 새롭게 빌드하지 않고 .\obj\Debug\net7.0 디렉터리에 빌드돼 있던 바이너리를 복사해 온다는 점입니다.

따라서, /p 옵션을 변경해 다시 빌드해야 한다면 \.obj\Debug\net7.0 디렉터리의 내용을 삭제하든가, 아니면 "dotnet clean" 명령어를 먼저 실행하고 진행해야 합니다.





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

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/29/2023]

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

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  189  190  191  192  193  [194]  195  ...
NoWriterDateCnt.TitleFile(s)
181정성태11/20/200548914.NET Framework: 54. 한글이 포함된 ANSI, UTF-8, UNICODE 텍스트 파일 읽기 [3]파일 다운로드1
197정성태12/25/200524250    답변글 .NET Framework: 54.4. [관련 문제] A 태그의 href에서의 문제.
198정성태12/27/200521851    답변글 .NET Framework: 54.5. [추가]: VS.NET으로 UTF-8 홈페이지 구성하기
179정성태11/8/200519493.NET Framework: 53. .NET Remoting: 메시지 교체
178정성태11/5/200520225기타: 11. Dual Core 장만. ^^
177정성태11/2/200520028COM 개체 관련: 17. CoGetClassObjectFromURL파일 다운로드1
176정성태3/29/200625702.NET Framework: 52. covariance? [1]파일 다운로드1
175정성태10/31/200521050.NET Framework: 51. MSXML 6.0에서 디지털 서명 기능을 제거!
180정성태11/15/200521202    답변글 VS.NET IDE: 51.1. MSXML 6.0 정식 릴리스
174정성태10/31/200522253.NET Framework: 50. app.config 예시 [1]
173정성태10/30/200520896스크립트: 5. 스크립트 호출 관계
172정성태10/25/200529509.NET Framework: 49. ASP.NET 오류 유형 : 액세스가 거부되었습니다. [2]
171정성태11/14/200531228VC++: 19. 다국어 지원: setlocale( LC_TIME, "" ) 관련 [1]
170정성태11/14/200525571VS.NET IDE: 34. Visual SourceSafe 2005: Remote Internet Access over HTTP : 80 이외의 포트를 지정
206정성태2/1/200622130    답변글 VC++: 34.1. [추가]: Internet Access Plug-in 사용 시 유의 사항
168정성태11/14/200523591VS.NET IDE: 33. IIS 6.0 AppPool 설정 - Enable rapid-fail protection
169정성태10/14/200525215    답변글 VS.NET IDE: 33.1. Enable rapid-fail protection 상황 재현 방법
166정성태11/14/200522118.NET Framework: 48. IE를 죽이는 스크립트 소스
165정성태11/14/200522845.NET Framework: 47. MOM (Microsoft Operations Manager) 2005 서버 설치 가이드
164정성태11/14/200519981.NET Framework: 46. 도메인에 속한 컴퓨터의 Local Computer Policy 변경 방법
162정성태10/3/200522561.NET Framework: 45. VS.NET 2005 IDE에서 Web App를 .NET 2.0 (x64) 머신에 배포
161정성태11/14/200525320.NET Framework: 44. IIS 관리자에서 ASP.NET 탭이 없는 경우.
159정성태9/28/200521454VS.NET IDE: 32. Virtual Server 2005 64bit SP1 Beta 테스트 [2]
163정성태10/3/200519480    답변글 VS.NET IDE: 32.1. 왜...?
158정성태11/14/200521744VS.NET IDE: 31. SQL 2005 - A connection was successfully established with the server
157정성태9/21/200521875기타: 10. SQL2000 설치 시, Invalid Product Key 오류
... 181  182  183  184  185  186  187  188  189  190  191  192  193  [194]  195  ...