Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

.NET Core/5+ 프로젝트에서 참조 DLL이 보관된 공통 디렉터리를 지정하는 방법

아래와 같은 질문이 있군요.

.net6 hint path 를 프로젝트 단위로 지정할 수 있는 방법을 알고싶습니다
; https://www.sysnet.pe.kr/3/0/5714

질문인즉, .NET Core/5+ 프로젝트에서 DLL을 직접 참조해야 한다면 다음과 같이 그 경로를 Reference의 하위에 HintPath를 이용해 알려야 합니다.

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

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

  <ItemGroup>
    <Reference Include="ClassLibrary1">
        <HintPath>..\..\ClassLibrary1\ClassLibrary1\bin\Debug\net6.0\ClassLibrary1.dll</HintPath>
    </Reference>
  </ItemGroup>

</Project>

그런데, 저걸 일일이 Reference 노드마다 지정하지 않고 프로젝트 전역적으로 통하는 방법을 알고 싶다는 것입니다. 사실 이런 경우는, msbuild에서 지원하지 않는 한 방법이 없습니다. 그러니까, 그 방법을 지원하고 있는지 찾아보면 되는데요, 아래의 글을 보면,

HintPath vs ReferencePath in Visual Studio
; https://stackoverflow.com/questions/1882038/hintpath-vs-referencepath-in-visual-studio

"Microsoft.Common.targets"에 지정된 빌드 스크립트의 어셈블리 참조 경로를 이렇게 정리해주고 있습니다. ^^

 <!--
    The SearchPaths property is set to find assemblies in the following order:

        (1) Files from current project - indicated by {CandidateAssemblyFiles}
        (2) $(ReferencePath) - the reference path property, which comes from the .USER file.
        (3) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
        (4) The directory of MSBuild's "target" runtime from GetFrameworkPath.
            The "target" runtime folder is the folder of the runtime that MSBuild is a part of.
        (5) Registered assembly folders, indicated by {Registry:*,*,*}
        (6) Legacy registered assembly folders, indicated by {AssemblyFolders}
        (7) Resolve to the GAC.
        (8) Treat the reference's Include as if it were a real file name.
        (9) Look in the application's output folder (like bin\debug)
-->

<AssemblySearchPaths Condition=" '$(AssemblySearchPaths)' == ''">
  {CandidateAssemblyFiles};
  $(ReferencePath);
  {HintPathFromItem};
  {TargetFrameworkDirectory};
  {Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)};
  {AssemblyFolders};
  {GAC};
  {RawFileName};
  $(OutDir)
</AssemblySearchPaths>

결국, msbuild의 기본 찾기 위치는 저렇게 총 9가지를 미리 등록해 두고 있었던 것입니다. 그럼, 방법이 나왔군요, 우리는 저 값을 이렇게 재정의하면 됩니다.

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

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

    <AssemblySearchPaths>
          {CandidateAssemblyFiles};
          $(ReferencePath);
          {HintPathFromItem};
          {TargetFrameworkDirectory};
          {Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)};
          {AssemblyFolders};
          {GAC};
          {RawFileName};
          $(OutDir);
          ..\..\ClassLibrary1\ClassLibrary1\bin\Debug\net6.0</AssemblySearchPaths>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="ClassLibrary1" />
  </ItemGroup>

</Project>

혹은, 다행히 기존 설정값을 내포하는 방법도 가능해 이렇게 짧게 줄이는 것도 됩니다.

<AssemblySearchPaths>
    $(AssemblySearchPaths);
    ..\..\ClassLibrary1\ClassLibrary1\bin\Debug\net6.0</AssemblySearchPaths>




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 8/18/2022]

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

비밀번호

댓글 작성자
 




[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13421정성태10/4/202342닷넷: 2147. C# - 비동기 메서드의 async 예약어 유무에 따른 차이
13420정성태9/26/2023245스크립트: 57. 파이썬 - UnboundLocalError: cannot access local variable '...' where it is not associated with a value
13419정성태9/25/2023338스크립트: 56. 파이썬 - RuntimeError: dictionary changed size during iteration
13418정성태9/25/2023446닷넷: 2146. C# - ConcurrentDictionary 자료 구조의 동기화 방식
13417정성태9/19/2023396닷넷: 2145. C# - 제네릭의 형식 매개변수에 속한 (매개변수를 가진) 생성자를 호출하는 방법
13416정성태9/19/2023455오류 유형: 877. redis-py - MISCONF Redis is configured to save RDB snapshots, ...
13415정성태9/18/2023546닷넷: 2144. C# 12 - 컬렉션 식(Collection Expressions)
13414정성태9/16/2023595디버깅 기술: 193. Windbg - ThreadStatic 필드 값을 조사하는 방법
13413정성태9/14/2023621닷넷: 2143. C# - 시스템 Time Zone 변경 시 이벤트 알림을 받는 방법
13412정성태9/14/2023666닷넷: 2142. C# 12 - 인라인 배열(Inline Arrays)
13411정성태9/12/2023565Windows: 252. 권한 상승 전/후 따로 관리되는 공유 네트워크 드라이브 정보
13410정성태9/11/2023710닷넷: 2141. C# 12 - Interceptor (컴파일 시에 메서드 호출 재작성)
13409정성태9/8/2023704닷넷: 2140. C# - Win32 API를 이용한 모니터 전원 끄기
13408정성태9/5/2023831Windows: 251. 임의로 만든 EXE 파일을 포함한 ZIP 파일의 압축을 해제할 때 Windows Defender에 의해 삭제되는 경우
13407정성태9/4/2023773닷넷: 2139. C# - ParallelEnumerable을 이용한 IEnumerable에 대한 병렬 처리
13406정성태9/4/2023761VS.NET IDE: 186. Visual Studio Community 버전의 라이선스
13405정성태9/3/2023872닷넷: 2138. C# - async 메서드 호출 원칙
13404정성태8/29/2023642오류 유형: 876. Windows - 키보드의 등호(=, Equals sign) 키가 눌리지 않는 경우
13403정성태8/21/2023656오류 유형: 875. The following signatures couldn't be verified because the public key is not available: NO_PUBKEY EB3E94ADBE1229CF
13402정성태8/20/2023683닷넷: 2137. ILSpy의 nuget 라이브러리 버전 - ICSharpCode.Decompiler
13401정성태8/19/20231015닷넷: 2136. .NET 5+ 환경에서 P/Invoke의 성능을 높이기 위한 SuppressGCTransition 특성 [1]
13400정성태8/10/2023741오류 유형: 874. 파이썬 - pymssql을 윈도우 환경에서 설치 불가
13399정성태8/9/2023945닷넷: 2135. C# - 지역 변수로 이해하는 메서드 매개변수의 값/참조 전달
13398정성태8/3/2023856스크립트: 55. 파이썬 - pyodbc를 이용한 SQL Server 연결 사용법
13397정성태7/23/2023938닷넷: 2134. C# - 문자열 연결 시 string.Create를 이용한 GC 할당 최소화
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...