[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)
한 단계로 출력 디렉토리를 제공합니다.