Visual Studio에서 DLL 파일을 출력 디렉터리에 복사하는 방법은 무엇입니까?


101

외부 DLL 파일에 의존하는 Visual Studio C ++ 프로젝트가 있습니다. 프로젝트를 빌드 할 때 Visual Studio에서이 DLL 파일을 출력 디렉터리 (디버그 / 릴리스)에 자동으로 복사하도록하려면 어떻게해야합니까?

답변:


91

프로젝트에서 빌드 후 작업을 사용하고 명령을 추가하여 문제가되는 DLL을 복사합니다. 빌드 후 작업은 배치 스크립트로 작성됩니다.

출력 디렉토리는 $(OutDir). 프로젝트 디렉토리는 $(ProjDir). 해당하는 경우 상대 경로를 사용하여 빌드 후 작업을 중단하지 않고 프로젝트 폴더를 복사하거나 이동할 수 있습니다.


26
또한 그가 프로젝트> 속성> 빌드 이벤트> 빌드 후 이벤트를 통해 빌드 후 이벤트를 설정할 수 있다는 점을 지적 할 가치가 있습니다.
Phil Booth


37
링크가 끊어지는 경우 : "xcopy / y"$ (ProjectDir) *. dll ""$ (OutDir) "
ace

위의 내용을 인스턴스에서 개인적으로 명령을 사용하는 방법으로 변경했습니다. 이것은 것입니다; 소스 제어에 적합한 읽기 전용 파일을 복사하고 대상 디렉토리를 만듭니다 (일반적으로 필요하지 않음). -> xcopy "$ (ProjectDir) *. dll" "$ (OutDir)"/ i / r / y
2013 년

8
/ d 플래그를 xCopy에 추가하여 출력 디렉터리에서 변경되지 않은 파일을 불필요하게 다시 복사하지 않도록합니다.
Zoey

44

$ (OutDir)은 VS2013에서 상대 경로로 판명되었으므로 원하는 효과를 얻기 위해 $ (ProjectDir)과 결합해야했습니다.

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

BTW, 시작 부분에 'echo'를 추가하여 스크립트를 쉽게 디버그하고 빌드 출력 창에서 확장 된 텍스트를 관찰 할 수 있습니다.


3
$ (TargetDir)은 $ (ProjectDir) $ (OutDir)을 대체 할 수 있습니다. 어쨌든 둘의 조합이기 때문입니다.
person27

내 경우에는 / d가 없으면 Access Denied 오류가 발생했습니다. 그러나 문서에 따라 / d는 날짜입니다. 연결이 무엇인지 확실하지 않습니다.
Ravi C

1
/ d를 추가하면 원본 파일이 오래되었거나 기존 파일과 같은 경우 덮어 쓰기를 방지 할 수 있습니다. 다른 프로세스에 의해 대상이 잠긴 경우 액세스 거부 오류가 발생할 수 있습니다.
Rich Shealer

7

한 C ++ 프로젝트의 출력 dll을 동일한 솔루션 내에서 다른 C # 프로젝트의 릴리스 및 디버그 폴더로 복사하려고 할 때 위의 주석 섹션의 세부 정보가 작동하지 않았습니다 (VS 2013).

다음 포스트 빌드 작업 (.dll 출력이있는 프로젝트를 마우스 오른쪽 버튼으로 클릭)을 추가 한 다음 속성-> 구성 속성-> 빌드 이벤트-> 빌드 후 이벤트-> 명령 줄을 추가해야했습니다.

이제 다음 두 줄을 추가하여 출력 dll을 두 폴더에 복사합니다.

xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug

5

(이 답변은 C ++가 아닌 C #에만 적용됩니다. 원래 질문을 잘못 읽었습니다.)

나는 전에 이와 같은 DLL 지옥을 겪었습니다. 내 마지막 해결책은 관리되지 않는 DLL을 관리되는 DLL에 바이너리 리소스로 저장하고 프로그램이 시작될 때 임시 폴더에 압축을 풀고 삭제되면 삭제하는 것입니다.

이것은 매우 유용하기 때문에 .NET 또는 pinvoke 인프라의 일부 여야 합니다 .... 관리 DLL을 관리하기 쉽게 만듭니다. Xcopy를 사용하거나 더 큰 Visual Studio 솔루션에서 프로젝트 참조로 사용할 수 있습니다. 이렇게하면 빌드 후 이벤트에 대해 걱정할 필요가 없습니다.

최신 정보:

여기에 다른 답변 https://stackoverflow.com/a/11038376/364818 에 코드를 게시했습니다.


1
동의합니다. 프레임 워크의 일부 여야합니다 (dll을 정적으로 연결하는 등).-dll을 리소스로 저장 한 다음 런타임에 추출하면 일부 기업 환경에서 문제가 발생할 수 있습니다 (특히 사전 예방 적 바이러스 백신 소프트웨어).
BrainSlugs83

1

project.csproj 파일에 내장 COPY를 추가 합니다.

  <Project>
    ...
    <Target Name="AfterBuild">
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
    </Target>
  </Project>

VS에 장기적인 버그가 있습니다. SolutionDir 대신 ProjectDir을 사용하세요
John_J

0
xcopy /y /d  "$(ProjectDir)External\*.dll" "$(TargetDir)"

상대 경로를 참조 할 수도 있습니다. 다음 예제에서는 프로젝트 폴더보다 한 수준 위에있는 폴더에서 DLL을 찾습니다. 단일 솔루션에서 DLL을 사용하는 여러 프로젝트가있는 경우이 중 하나를 시작 프로젝트로 설정할 때 연결할 수있는 공통 영역에 DLL 소스를 배치합니다.

xcopy /y /d  "$(ProjectDir)..\External\*.dll" "$(TargetDir)"

/y확인없이 옵션 복사합니다. 이 /d옵션은 파일이 대상에 있는지 확인하고 원본에 대상보다 새로운 타임 스탬프가있는 경우에만 복사되는지 확인합니다.

VS2109와 같은 Visual Studio의 적어도 최신 버전에서는 $(ProjDir)정의되지 않았으며 $(ProjectDir)대신 사용해야 했습니다.

대상 폴더를 그대로두면 xcopy기본적으로 출력 디렉토리가됩니다. 이유 $(OutDir)만으로는 도움이되지 않는다는 것을 이해하는 것이 중요 합니다.

$(OutDir), 적어도 최신 버전의 Visual Studio에서는 출력 폴더에 대한 상대 경로 (예 : bin/x86/Debug. 대상으로 단독으로 사용하면 프로젝트 출력 폴더에서 시작하는 새로운 폴더 세트가 생성됩니다. 예 : … bin/x86/Debug/bin/x86/Debug.

프로젝트 폴더와 결합하면 적절한 위치로 이동할 수 있습니다. 예 : $(ProjectDir)$(OutDir).

그러나 $(TargetDir)한 단계로 출력 디렉토리를 제공합니다.

Visual Studio의 현재 및 이전 버전에 대한 Microsoft의 MSBuild 매크로 목록

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.