Development Tip

Visual Studio에서 DLL의 종속성 복사

yourdevel 2020. 11. 28. 12:35
반응형

Visual Studio에서 DLL의 종속성 복사


프로젝트의 참조 중 하나가 의존하는 타사 DLL을 복사하도록 Visual Studio에서 프로젝트를 설정하려면 어떻게해야합니까?

주 응용 프로그램 프로젝트와 클래스 라이브러리 DLL이 있습니다. 주 응용 프로그램은 클래스 라이브러리 DLL을 참조하고 DLL 자체는 일부 타사 DLL을 참조합니다. 주 응용 프로그램을 컴파일하면 자동으로 클래스 라이브러리 DLL을 출력 디렉터리에 복사하지만 타사 DLL은 복사하지 않습니다.

주 응용 프로그램이 사용하지 않고 클래스 라이브러리에서만 사용되기 때문에 주 응용 프로그램 프로젝트에서 타사 DLL에 대한 참조를 추가하고 싶지 않습니다.


프로젝트 속성 창에서이를 수행 할 수 있습니다. Visual Studio를 사용하면 빌드 전 또는 후에 발생할 이벤트를 정의 할 수 있습니다. 프로젝트 속성 창으로 이동하려면 솔루션 탐색기 창에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 '속성'을 클릭하면됩니다. 왼쪽에서 '빌드 이벤트'탭으로 이동합니다.

빌드 후 상자에 몇 가지 복사 명령을 입력합니다. 예를 들면 :

copy "$(SolutionDir)mydll.dll" "$(TargetDir)"

어디 $(SolutionDir)$(TargetDir)두 미리 정의 된 변수입니다. 표준 구문은 다음과 같습니다.

copy "source directory and file name" "destination directory"

'편집 후 빌드 ...'버튼을 클릭하면 삽입 할 수있는 사전 정의 된 변수 목록이있는 상자가 나타납니다 (예 : $(SolutionDir)$(TargetDir)).

참고로 이것은 사용자 지정 구성 파일, 이미지 또는 프로젝트에있을 수있는 기타 종속성과 같은 다른 파일을 복사하는 데 유용한 프로세스입니다.


다음 조각이 저에게 효과적입니다.

<Project>
  ...
  <ItemGroup>
    <Content Include="Path\to\dll\dllname.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  ...
</Project>

이것은 C #에서 작동합니다. 네이티브 C ++의 경우 여전히 dll을 출력 폴더에 복사하지만이 종속성은 Visual Studio에서 표시되지 않으므로 프로젝트 파일에서 직접 편집해야합니다.

사소하지 않은 예제를 테스트하기 위해 네이티브 C ++ 프로젝트 B에 의존하는 C # 프로젝트 A를 실행하려고했습니다. B 프로젝트는 타사 네이티브 dll C에 의존합니다.이 종속성은 프로젝트 파일에서 위의 조각을 통해 구현됩니다. A를 빌드하면 C가 바이너리 폴더에 복사됩니다.

Visual Studio 2010에서 시도했습니다.


Alex Yakunin이 제공 한이 솔루션을 살펴보십시오. http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html 정말 멋지게 작동했습니다. 명시 적으로 사용 된 DevExpress 라이브러리의 시나리오는 배포시 문제를 일으킨 기타 종속성)

  • 참고 1 : Visual Studio 2010은 참조 된 dll을 자동으로 추가하는 것처럼 보이지만 msbuild는 그렇지 않습니다. 그래서 Alex의 솔루션은 릴리스 스크립트가 msbuild를 사용했기 때문에 작동했습니다.
  • 참고 2 : 또한 참조 된 라이브러리 (코드에서 참조 된 라이브러리)에 대해 copy-local이 실제로 csproj에서 True로 설정되어 있는지 확인해야했습니다. 가장 좋은 방법은 copy-local = False, Save, set copy-local = True, Save를 설정하는 것입니다.

이 두 단계-참조 된 라이브러리에 대해 copy-local = true 및 간접 참조에 대한 msbuild 대상을 추가하면 빌드 설정이 자동화되었습니다.


나는 이것을 권장하지 않습니다. 복사되는 (그리고 잠재적으로 재 구축되는) 어셈블리 수에서 N ^ 2 폭발이 발생합니다. 가능하면 모든 프로젝트에서 어셈블리를 동일한 $ (OutDir)에 배치해야합니다. TFS를 사용하는 경우 Team Build가이 작업을 수행합니다.


주 응용 프로그램 인 참조로 이동하여 클래스 라이브러리 참조로 이동합니다.

"로컬 복사"를 True로 설정하십시오.

이제 클래스 라이브러리의 bin 디렉토리를 메인 애플리케이션 bin 디렉토리에 복사합니다. 하위 종속성 타사 dll을 포함합니다.


프로젝트 루트 폴더가 아니라 하위 폴더에있는 종속성 파일을 갖고 싶지 않습니다. 그러나 파일은 빌드 폴더의 루트 폴더에 있어야합니다.

내 빌드 이벤트는 다음과 같습니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력

 Command: call xcopy /S /Y "$(SolutionDir)Dependencies\*.*" "$(TargetDir)"

"종속성"에도 내 것과 같이 하위 폴더가 포함되어있는 경우.


100 % 확실합니다. dll을 개인 참조로 바꾸십시오. 파일

<Reference Include="Xceed.Wpf.Toolkit">
  <HintPath>..\..\..\3rdParty\Extended WPF Toolkit-2.2.1\Xceed.Wpf.Toolkit.dll</HintPath>
   <CopyToOutputDirectory>Always</CopyToOutputDirectory>   
   <SpecificVersion>False</SpecificVersion> 
</Reference>

<Content Include="..\..\..\3rdParty\Extended WPF Toolkit-2.2.1\Xceed.Wpf.Toolkit.dll">
  <Link>Xceed.Wpf.Toolkit.dll</Link>
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  <SpecificVersion>False</SpecificVersion>
</Content>

프로젝트 자체에서 .dll에 대한 참조를 추가하는 것 외에는 이것을 수행하는 방법을 실제로 알지 못합니다. 여기에있는 일부 자체 프로젝트에서이 문제를 실행했으며, 우리가 찾은 유일한 해결책은 참조를 추가하는 것입니다. 우리 개발자 중 한 명이 조사를했고 이것이 유일한 해결책이라는 것을 알았지 만 저를 인용하지 마십시오.

참고 URL : https://stackoverflow.com/questions/1043913/copying-a-dlls-dependencies-in-visual-studio

반응형