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

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12246정성태6/29/202020225.NET Framework: 917. C# - USB 관련 ETW(Event Tracing for Windows)를 이용한 키보드 입력을 감지하는 방법
12245정성태6/24/202020668.NET Framework: 916. C# - Task.Yield 사용법 (2) [2]파일 다운로드1
12244정성태6/24/202020613.NET Framework: 915. ETW(Event Tracing for Windows)를 이용한 닷넷 프로그램의 내부 이벤트 활용 [1]파일 다운로드1
12243정성태6/23/202017020VS.NET IDE: 147. Visual C++ 프로젝트 - .NET Core EXE를 "Debugger Type"으로 지원하는 기능 추가
12242정성태6/23/202018655오류 유형: 623. AADSTS90072 - User account '...' from identity provider 'live.com' does not exist in tenant 'Microsoft Services'
12241정성태6/23/202021325.NET Framework: 914. C# - Task.Yield 사용법파일 다운로드1
12240정성태6/23/202022619오류 유형: 622. 소켓 바인딩 시 "System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions" 오류 발생
12239정성태6/21/202021675Linux: 30. (윈도우라면 DLL에 속하는) .so 파일이 텍스트로 구성된 사례 [1]
12238정성태6/21/202019604.NET Framework: 913. C# - SharpDX + DXGI를 이용한 윈도우 화면 캡처 라이브러리
12237정성태6/20/202019302.NET Framework: 912. 리눅스 환경의 .NET Core에서 "test".IndexOf("\0")가 0을 반환
12236정성태6/19/202020124오류 유형: 621. .NET Standard 대상으로 빌드 시 dynamic 예약어에서 컴파일 오류 - error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
12235정성태6/19/202018382오류 유형: 620. Windows 10 - Inaccessible boot device 블루 스크린
12234정성태6/19/202017946개발 환경 구성: 494. NuGet - nuspec의 패키지 스키마 버전(네임스페이스) 업데이트 방법
12233정성태6/19/202019126오류 유형: 619. SQL 서버 - The transaction log for database '...' is full due to 'LOG_BACKUP'. - 두 번째 이야기
12232정성태6/19/202017425오류 유형: 618. SharePoint - StoreBusyRetryLater 오류
12231정성태6/15/202021016.NET Framework: 911. Console/Service Application을 위한 SynchronizationContext - AsyncContext
12230정성태6/15/202019749오류 유형: 617. IMetaDataImport::GetMethodProps가 반환하는 IL 코드 주소(RVA) 문제
12229정성태6/13/202021781.NET Framework: 910. USB/IP PROJECT를 이용해 C#으로 USB Keyboard + Mouse 가상 장치 만들기 [1]
12228정성태6/12/202020365.NET Framework: 909. C# - Source Generator를 적용한 XmlCodeGenerator파일 다운로드1
12227정성태6/12/202024445오류 유형: 616. Visual Studio의 느린 업데이트 속도에 대한 원인 분석 [5]
12226정성태6/11/202023133개발 환경 구성: 493. OpenVPN의 네트워크 구성 [4]파일 다운로드1
12225정성태6/11/202020852개발 환경 구성: 492. 윈도우에 OpenVPN 설치 - 클라이언트 측 구성
12224정성태6/11/202029726개발 환경 구성: 491. 윈도우에 OpenVPN 설치 - 서버 측 구성 [1]
12223정성태6/9/202026233.NET Framework: 908. C# - Source Generator 소개 [10]파일 다운로드2
12222정성태6/3/202018709VS.NET IDE: 146. error information: "CryptQueryObject" (-2147024893/0x80070003)
12221정성태6/3/202018554Windows: 170. 비어 있지 않은 디렉터리로 symbolic link(junction) 연결하는 방법
... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...