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

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



답변

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

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


답변

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

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

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


답변

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

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

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

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


답변

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

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

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

최신 정보:

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


답변

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>


답변

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 매크로 목록


답변