종속 DLL이 Visual Studio의 빌드 출력 폴더에 복사되지 않습니다.
비주얼 스튜디오 솔루션이 있습니다.저는 해결책에 많은 프로젝트가 있습니다.시작 역할을 하고 다른 프로젝트를 사용하는 주요 프로젝트가 하나 있습니다."Project X"라는 프로젝트가 하나 있습니다.참조가 주 프로젝트에 추가됩니다.ProjectX는 다른 것을 참조합니다.솔루션의 일부가 아닌 NET dll(예: abc.dll).
이제 이 abc.dll을 메인 프로젝트의 bin/debug 폴더에 복사해야 하는데, 거기에 복사되지 않습니다.왜 복사가 안 되는 거지, 알려진 이유가 있나요?
ProjectX가 abc.dll을 참조했지만 abc.dll에 정의된 유형을 직접 사용하지 않으면 abc.dll이 주 출력 폴더에 복사되지 않습니다.(이는 ProjectX 출력 폴더에 복사되어 매우 혼란스러울 수 있습니다.
따라서 Project X의 어디에서나 abc.dll 형식을 명시적으로 사용하지 않는 경우 Project X의 파일 중 하나에 더미 선언을 넣으십시오.
AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied
모든 클래스에 대해 이 작업을 수행할 필요는 없습니다. DLL 복사본을 만들고 모든 작업이 예상대로 작동하기에 한 번만 충분합니다.
부록:디버그 모드에서는 작동할 수 있지만 릴리스에서는 작동하지 않습니다.자세한 내용은 @nvirth의 답변을 참조하십시오.
오버로드 저그의 대답에 대한 부차적인 메모일 뿐입니다.
이런 식으로 더미 참조를 추가했는데 디버깅 모드에서 작동했습니다.
public class DummyClass
{
private static void Dummy()
{
var dummy = typeof(AbcDll.AnyClass);
}
}
그러나 릴리스 모드에서는 종속 dll이 여전히 복사되지 않았습니다.
그러나 이것은 효과가 있었습니다.
public class DummyClass
{
private static void Dummy()
{
Action<Type> noop = _ => {};
var dummy = typeof(AbcDll.AnyClass);
noop(dummy);
}
}
이 정보를 알아내는 데 몇 시간이 걸렸습니다. 그래서 저는 그것을 공유한다고 생각했습니다.
예, 설야합니로 설정하셔야 .Copy Local
true
하지만, 저는 당신이 또한 메인 프로젝트와 세트에서 그 어셈블리를 참조할 필요가 있다고 확신합니다.Copy Local
true
또한 - 종속 어셈블리에서만 복사되는 것이 아닙니다.
다음 페이지로 이동할 수 있습니다.Copy Local
래에서 어클를속에서 됩니다.References
F4를 누릅니다.
조립 속성으로 만들 때 매끈매끈해 보입니다.
[AttributeUsage(AttributeTargets.Assembly)]
public class ForceAssemblyReference: Attribute
{
public ForceAssemblyReference(Type forcedType)
{
//not sure if these two lines are required since
//the type is passed to constructor as parameter,
//thus effectively being used
Action<Type> noop = _ => { };
noop(forcedType);
}
}
사용 방법은 다음과 같습니다.
[assembly: ForceAssemblyReference(typeof(AbcDll.AnyClass))]
같은 문제가 발생했습니다.배경 정보: 구축하기 전에 솔루션에 새로운 프로젝트 X를 추가했습니다.Y 프로젝트는 X 프로젝트에, A, B, C 프로젝트는 Y 프로젝트에 의존했습니다.
빌드 오류는 프로젝트 A, B, C, Y 및 Xdll을 찾을 수 없습니다.
근본 원인은 새로 만든 X 프로젝트가 대상이 된 것입니다.NET 4.5는 나머지 솔루션 프로젝트를 대상으로 합니다.NET 4.5.1.프로젝트 X가 빌드되지 않아 나머지 프로젝트도 빌드되지 않았습니다.
새로 추가된 프로젝트의 대상이 동일한지 확인합니다.NET 버전을 나머지 솔루션으로 사용합니다.
이것이 도움이 될지는 모르겠지만 DLL을 참조할 때가 많습니다(물론 자동으로 bin 폴더에 추가됨).그러나 사용 중인 기능에 따라 해당 DLL에 추가 DLL이 필요할 수 있습니다.프로젝트에 포함된 항목을 참조하고 싶지 않습니다. 해당 항목은 실제 사용 중인 DLL과 동일한 폴더에 있어야 하기 때문입니다.
Visual Studio에서 "기존 파일 추가"를 사용하여 이 작업을 수행합니다.Add_data 폴더를 제외한 모든 위치에 추가할 수 있어야 합니다.개인적으로 저는 그것을 뿌리에 추가합니다.
그런 다음 해당 파일의 속성을 ...로 변경합니다.
Build Action = 없음(이 설정을 Content와 같은 것으로 설정하면 실제로 "루트" 버전이 루트에 복사되고 Bin에 복사본이 추가됩니다.
Copy to output folder = Copy if Newer (기본적으로 없는 경우에만 BIN 폴더에 넣지만 그 이후에는 하지 않음)
게시할 때...추가된 DLL은 BIN 폴더에만 있고 게시 위치에는 없습니다.
또한 찾고 있는 DLL이 GAC에 포함되어 있지 않은지 확인할 수 있습니다.Visual Studio는 빌드 머신의 GAC에 이미 존재하는 경우 해당 파일을 복사하지 않는 것에 대해 현명하다고 생각합니다.
저는 최근에 이런 상황에서 GAC에 어셈블리가 있어야 하는 SSIS 패키지를 테스트하고 있었습니다.그 이후로 저는 그것을 잊고 있었고 왜 빌드하는 동안 이러한 DLL이 나오지 않는지 궁금했습니다.
Visual Studio Developer 명령 프롬프트에서 GAC의 내용을 확인하려면:
gacutil -l
또는 읽기 쉽도록 파일로 출력:
gacutil -l > output.txt
notepad.exe output.txt
어셈블리를 제거하는 방법
gacutil -u MyProjectAssemblyName
또한 GAC에서 파일을 제거한 후 빌드 후 \bin 디렉터리에 올바르게 출력되었습니다(루트 프로젝트에서 직접 참조되지 않은 어셈블리의 경우에도 마찬가지임).이것은 Visual Studio 2013 업데이트 5에 있습니다.
참조된 어셈블리를 마우스 오른쪽 단추로 클릭하면 로컬 복사라는 속성이 표시됩니다.로컬 복사가 true로 설정된 경우 어셈블리가 빈에 포함되어야 합니다.하지만 Visual studio에 문제가 있는 것 같습니다. 때때로 bin 폴더에 참조된 dll이 포함되지 않습니다.이것이 저에게 효과적인 해결 방법입니다.
저의 경우, 그것은 제가 동의하지 않는 TFS/VS의 기본 동작으로 인해 발생한 가장 어리석은 일이었습니다.
메인 프로젝트에 대한 참조로 dll을 추가하는 것이 효과적이지 않았기 때문에 Copy Local = Always로 "Existing Item"으로 추가하기로 결정했습니다.그때도 파일은 거기에 없었습니다.
VS 솔루션에 파일이 있고 로컬 및 서버 모두에서 컴파일된 모든 항목이 있지만 VS/TFS가 실제로 파일을 소스 제어에 추가하지 않은 것으로 나타났습니다.변경사항 보류 중에 전혀 포함되지 않았습니다.수동으로 소스 제어 탐색기로 이동하여 "폴더에 항목 추가" 아이콘을 명시적으로 클릭해야 했습니다.
내가 VS에서 15년 동안 발전해왔기 때문에 바보야.예전에 이런 일을 당한 적이 있는데, 그냥 기억이 안 나서 어떻게든 놓쳤어요. 왜냐하면 파일이 정기적인 참조이기 때문에 모든 것이 아직 컴파일되어 있지만 기존 항목으로 추가된 파일이 소스 제어 서버에 존재하지 않기 때문입니다.
저는 이것으로 제 인생의 이틀을 잃었기 때문에, 이것이 누군가를 시간을 절약해주기를 바랍니다.
문제:
빌드 출력에 참조된 DLL이 포함되어 있지 않은 NuGet 패키지 DLL(Newtonsoft.json.dll)에서도 유사한 문제가 발생했습니다.하지만 편집은 잘 되어갑니다.
수정:
텍스트 편집기에서 프로젝트를 살펴보고 "개인" 태그가 있는 참조를 찾습니다.참 또는 거짓과 같습니다."Private"는 "Copy Local"의 동의어입니다.MSBuild는 작업의 어딘가에서 종속성을 찾고 있으며 다른 곳에서 종속성을 찾아 복사하지 않기로 결정합니다.
각 .csproj/.vbproj 파일을 살펴보고 태그를 수동으로 제거합니다.다시 빌드하면 Visual Studio와 MSBuild에서 모두 작동합니다.작업이 완료되면 다시 들어가서 필요한 위치로 업데이트할 수 있습니다.
참조:
https://www.paraesthesia.com/archive/2008/02/13/what-to-do-if-copy-local-works-in-vs-but.aspx/
사용자가 사용하는 종속 DLL에 대상이 없는지 확인합니다.NET Framework가 대상보다 높습니다.프로젝트 응용프로그램의 NET 프레임워크입니다.
프로젝트를 선택한 다음 ENTER+를 누른 다음 왼쪽에서 Application을 선택하고 프로젝트의 Target Framework를 선택하여 이를 확인할 수 있습니다.
종속 DLL 대상 프레임워크 = 4.0 및 응용 프로그램 DLL 대상 프레임워크 = 3.5를 4.0으로 변경한다고 가정합니다.
감사해요!
이것은 nvirst의 예에 대한 약간의 수정입니다.
internal class DummyClass
{
private static void Dummy()
{
Noop(typeof(AbcDll.AnyClass));
}
private static void Noop(Type _) { }
}
필요한 라이브러리를 출력 디렉터리에 복사하기 위해 빌드 후 이벤트에 추가합니다.XCopy 경로를 라이브러리 대상 디렉터리로 복사
프로젝트 속성 -> Build Events에서 확인할 수 있습니다.
TLDR; Visual Studio 2019를 다시 시작해야 할 수도 있습니다.
마이크로소프트를 기반으로 한 프로젝트를 통해 이런 상황을 접했습니다.NET.Sdk 프로젝트.
<Project Sdk="Microsoft.NET.Sdk">
구체적으로:
Project1
표들적.netstandard2.1
Microsoft.Extensions.Logging.Console
경유
Project2
표들적.netstandard2.1
Project1
Project2Tests
표들적.netcoreapp3.1
Project2
에 " 트실행시다같은오메받를았다니습지시류테스과음다▁indic니▁▁error▁at습▁that"라는 오류 를 받았습니다.Microsoft.Extensions.Logging.Console
찾을 수 없으며 출력 디렉터리에 없습니다.
다음을 추가하여 문제를 해결하기로 결정했습니다.Microsoft.Extensions.Logging.Console
Project2
가 Visual Studio의 Nuget Manager를 하지 않은 했습니다.Microsoft.Extensions.Logging.Console
바된같에 Project1
그것이 존재함에도 불구하고.Project1.csproj
java.
Visual Studio를 간단히 종료한 후 다시 시작하면 추가 참조를 추가할 필요 없이 문제가 해결되었습니다.아마도 이것은 생산성 손실의 45분을 절약할 수 있을 것입니다 :-)
메인 프로젝트와 ProjectX의 빌드 출력 경로를 모두 동일한 폴더로 설정하면 해당 폴더에 필요한 dll을 모두 가져올 수 있습니다.
냥그:
실행 가능한 프로젝트에 참조 추가
실행 에 "" " " " " "이 있는지 합니다."Copy Local"
로 설정한.TRUE
(내 "잘못"은) 기본 참조 라이브러리 프로젝트의 설정을 "잘못"한 것 같습니다.
위의 일반적인 것 외에도, 저는 여러 프로젝트 솔루션을 게시해야 했습니다.일부 파일은 서로 다른 프레임워크를 대상으로 합니다.
So my solution : Properties > Specific Version (False)
DLL을 프로젝트 중 하나에 기존 항목으로 추가하고 정렬해야 합니다.
VS2019 V16.6.3
저에게 문제는 어떻게든 메인 .proj 파일이 상위 프로젝트 bin 폴더에 DLL이 복사되지 않는 프로젝트에 대한 다음과 같은 항목으로 마무리되었다는 것입니다.
<ProjectReference Include="Project B.csproj">
<Project>{blah blah}</Project>
<Name>Project B</Name>
<Private>True</Private>
</ProjectReference>
수동으로 라인을 삭제했습니다.<Private>True</Private>
그런 다음 DLL이 메인 프로젝트의 모든 빌드에 있는 메인 프로젝트 빈 폴더에 복사되었습니다.
기본 프로젝트의 참조 폴더에 있는 문제 프로젝트의 참조로 이동하면 해당 항목을 클릭하고 속성을 보면 "로컬 복사" 설정이 있습니다.개인 태그는 이 설정과 동일하지만, 어떤 이유로 로컬 복사를 변경하는 것은 .proj 파일의 개인 태그에 영향을 미치지 않았습니다.
짜증스럽게도 참조를 위해 로컬 복사 값을 변경하지 않았고, 어떻게 그렇게 설정되었는지 전혀 알지 못했으며, 또 다른 하루는 VS의 어리석은 문제를 추적하느라 시간을 낭비했습니다.
다른 모든 답변들 덕분에 저는 그 원인에 대해 집중할 수 있었습니다.
HTH
프로젝트에 콘텐츠로 포함하고 '항상 복사' 설정된 DLL이 bin 폴더에 복사되지 않는 유사한 문제가 있었습니다.저는 app.config의 DLL에 종속 어셈블리 참조를 추가하여 이 문제를 해결했습니다.
언급URL : https://stackoverflow.com/questions/15816769/dependent-dll-is-not-getting-copied-to-the-build-output-folder-in-visual-studio
'itsource' 카테고리의 다른 글
스크립트 자체 내에서 전체 셸 스크립트의 출력을 리디렉션하는 방법은 무엇입니까? (0) | 2023.05.12 |
---|---|
각 매개 변수에서 후행 슬래시를 제거하는 가장 간단한 방법은 무엇입니까? (0) | 2023.05.12 |
파이썬 데이터 클래스를 해시 가능하게 만들려면 어떻게 해야 합니까? (0) | 2023.05.12 |
Azure 가상 시스템과 클라우드 서비스의 차이점은 무엇입니까? (0) | 2023.05.12 |
Swift를 사용하여 프로그래밍 방식으로 UI 레이블을 만드는 방법은 무엇입니까? (0) | 2023.05.12 |