비주얼 스튜디오 솔루션이 있습니다. 솔루션에 많은 프로젝트가 있습니다. 시작 역할을하고 다른 프로젝트를 사용하는 하나의 주요 프로젝트가 있습니다. “ProjectX”라는 프로젝트가 있습니다. 참조는 기본 프로젝트에 추가됩니다. ProjectX는 솔루션의 일부가 아닌 다른 .NET dll (예 : abc.dll)을 참조합니다.
이제이 abc.dll은 기본 프로젝트의 bin / debug 폴더에 복사해야하지만 복사되지는 않습니다. 알려진 이유가 무엇입니까?
답변
ProjectX가 abc.dll을 참조했지만 abc.dll에서 DEFINED 유형을 직접 사용하지 않으면 abc.dll이 기본 출력 폴더로 복사되지 않습니다. (이는 혼동을 피하기 위해 ProjectX 출력 폴더로 복사됩니다.)
따라서 ProjectX의 어느 곳에서나 abc.dll의 유형을 명시 적으로 사용하지 않는 경우 더미 선언을 ProjectX의 파일 중 하나에 넣으십시오.
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))]
답변
이 같은 문제에 부딪쳤다. 배경 정보 : 구축하기 전에 솔루션에 새로운 Project X를 추가했습니다. 프로젝트 Y는 프로젝트 X에 의존하고 프로젝트 A, B, C는 프로젝트 Y에 의존했습니다.
빌드 오류는 프로젝트 A, B, C, Y 및 X dll을 찾을 수 없다는 것입니다.
근본 원인은 새로 생성 된 Project X가 .NET 4.5를 대상으로했지만 나머지 솔루션 프로젝트는 .NET 4.5.1을 대상으로했기 때문입니다. 프로젝트 X가 빌드되지 않아 나머지 프로젝트가 빌드되지 않았습니다.
새로 추가 된 프로젝트가 나머지 솔루션과 동일한 .NET 버전을 대상으로해야합니다.
답변
이것이 도움이되는지 확실하지는 않지만, 여러 번 DLL을 참조합니다 (물론 자동으로 bin 폴더에 추가합니다). 그러나 해당 DLL에는 사용중인 기능에 따라 추가 DLL이 필요할 수 있습니다. 프로젝트에서 실제로 참조하는 것과 같은 폴더에 있어야하기 때문에 프로젝트에서 참조하고 싶지 않습니다.
Visual Studio에서 “기존 파일 추가”를 통해이 작업을 수행합니다. Add_data 폴더를 제외한 모든 위치에 추가 할 수 있어야합니다. 개인적으로 나는 그것을 루트에 추가합니다.
그런 다음 해당 파일의 속성을 …로 변경하십시오.
빌드 조치 = 없음 (이 세트를 Content와 같은 것으로 설정하면 실제로는 “루트”버전을 루트에 복사하고 Bin의 사본을 복사합니다).
출력 폴더에 복사 = 최신 인 경우 복사 (기본적으로 BIN 폴더에없는 경우에만 폴더를 저장하지만 그 후에는 수행하지 않음)
게시 할 때 .. 추가 된 DLL은 BIN 폴더와 게시 위치 (원하는 위치)에만 존재합니다.
답변
찾고있는 DLL이 GAC에 포함되어 있지 않은지 확인할 수도 있습니다. Visual Studio가 빌드 머신의 GAC에 이미 존재하는 경우 해당 파일을 복사하지 않는 것이 현명하다고 생각합니다.
최근에 GAC에 어셈블리가 필요한 SSIS 패키지를 테스트하고있는 상황에 처했습니다. 나는 그것을 잊어 버렸고 왜 DLL이 빌드 중에 나오지 않는지 궁금했습니다.
Visual Studio 개발자 명령 프롬프트에서 GAC의 내용을 확인하려면
gacutil -l
또는 쉽게 읽을 수 있도록 파일로 출력하십시오.
gacutil -l > output.txt
notepad.exe output.txt
어셈블리를 제거하려면
gacutil -u MyProjectAssemblyName
또한 GAC에서 파일을 제거한 후에는 빌드 후 \ bin 디렉토리에 올바르게 출력되었습니다 (루트 프로젝트에서 직접 참조되지 않은 어셈블리의 경우에도). 이것은 Visual Studio 2013 업데이트 5에있었습니다.