2014-10-15 6 views
5

다른 어셈블리의 인터페이스를 구현하는 클래스로 어셈블리가 완전히 채워져 있습니다. 예 :빌드가 최적화 된 어셈블리

Main Assembly (Reference to both assemblies) 

Shared Assembly 
-----IModule 

Class Assembly (Reference to shared assembly) 
-----unknownType : IModule 
-----unknownType2 : IModule 

주 어셈블리는 클래스 어셈블리의 모든 형식을 직접 참조하지 않습니다. 내가 참조 클래스 조립 단지 임의의 종류에, 다음이 GetReferencedAssemblies에 표시가있는 경우로드되는,

// Load all referenced assemblies: 
Assembly.GetExecutingAssembly().GetReferencedAssemblies() 
    .Except(AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName())) 
    .Distinct() 
    .ToList() 
    .ForEach(act => Assembly.Load(act)); 

// Find all instances of IModule in loaded assemblies: 
var modules = from asm in AppDomain.CurrentDomain.GetAssemblies() 
    from provider in asm.GetTypes() 
    where typeof(IModule).IsAssignableFrom(provider) 
    ...instantiate type etc... 

, 제대로 반환 - 나는 즉시 있지만 : 그래서 같은 종류를 찾고 있어요 형식에 대한 참조를 제거하면 빌드 디렉토리로 전송되지 않거나로드가 실패하는 참조 된 어셈블리로 표시되지 않습니다.

VS가이 어셈블리를 출력 디렉터리에 포함하도록 강제 할 수있는 방법이 있습니까? 주 애플리케이션은 클래스 어셈블리 내의 어떤 타입에 대해서도 알지 못한다.

+3

나는 유사한 문제가 있음을 기억하고 프로젝트에서 참조 된 어셈블리에 더미 호출을 추가하는 것이 유일한 해결책이었습니다 ... –

+0

@KevinD : 주 어셈블리는 무엇이 계속 진행되는지 알 필요가 없으므로 클래스 어셈블리에서 클래스 어셈블리의 형식이 그 목적을 위해 특별히 작성되지 않았다면 현실적으로 더미 참조를 추가 할 수 없습니다. 문제는 여기에있는 예제가 단순화되고 그렇게하면 불필요한 복잡성과 진흙이 디자인에 추가된다는 것입니다. – caesay

+1

이것은 솔루션 별 문제입니까? 아니면 임의의 상황에서 재현하기위한 단계를 제공 할 수 있습니까? – Grx70

답변

-1

문제가 발생한다고 생각하지만 질문을 명확히 할 수 있습니까? 응용 프로그램과 함께 출력 폴더에 복사 할 프로젝트에 대한 참조로 추가 한 어셈블리가 필요합니까? 어떻게 참조를 추가 했습니까? 파일 대화 상자에서 탐색 한 .dll 또는 .exe입니까? 아니면 참조 추가 대화 상자의 목록에서 선택한 COM 또는 GAC 어셈블리입니까?

사용자가 GAC 디렉토리에 있지 않은 경우이 유형의 최적화가 필요합니다. 솔루션 탐색기에서 참조를 선택하고 속성 창에서 "로컬 복사"가 true로 설정되어 있는지 확인하십시오. 이 설정을 그대로 사용해도 좋습니다. 참조를 포함하도록 .vsproj 파일을 다시 작성하면됩니다.

문자열에 저장된 파일 이름에서 .dll을 참조하거나 런타임에 선택하려는 경우 Visual Studio는 응용 프로그램이 파일을 사용하고 있음을 알지 못하지만 출력 디렉토리. .dll의 경로가 있으면 File.Copy를 사용하여 그렇게하는 것이 너무 어렵지 않아야합니다.

+0

분명히 원래 게시물에 댓글을 작성한 사람들은 질문에 대해 더 잘 이해하고 더 나은 답변을 제공했습니다. 코드의 직접적인 용도가없는 경우에도 프로젝트 종속성 (참조)으로 출력 디렉터리에 복사 할 추가 된 어셈블리를 기대하고 있습니다. Visual Studio에서는 유형을 직접 사용하지 않으며 참조 된 어셈블리를 출력 디렉토리에 복사하지 않습니다. 문제는이 최적화 동작을 방지하는 방법에 관한 것입니다. – caesay

+0

아, 설명해 주셔서 감사합니다. 귀하의 질문에 물음표가 없었습니다. 그래서 당신이 답을 원했던 진술을 찔렀습니다. 솔루션 디렉토리에서 .csproj 파일을 열고 종속성을 확인해 보셨습니까? 나는 VS 2008에 포함되지 않은 이미지 및 아이콘 리소스와 비슷한 문제를 가지고 있었고, 그런 다음 Explicit이 참조를 읽을 수 없도록하는 선을 제거하여 Copy Local 설정을 읽을 수 없었습니다. 호기심에서 왜 어셈블리에서 어셈블리를 동적으로 참조하기를 원하지만 코드의 이름이 아닌가? –

관련 문제