2013-01-14 5 views
-1

하나의 C# WinForms 프로젝트가 포함 된 솔루션에서 EmguCV를 참조해야합니다.참조 된 어셈블리의 여러 버전 간 자동 전환

동일한 라이브러리의 네 가지 버전, 즉 x86 vand x64가 있으며 GPU가 지원되거나 지원되지 않습니다. 이 라이브러리에는 OpenCV의 관리되지 않는 DLL뿐만 아니라 EmguCV의 관리 DLL에 대한 참조가 필요합니다. 올바른 비 관리 버전을 [Bin] 폴더에 복사하는 것은 빌드 후 이벤트를 통해 쉽습니다.

코드를 통해 관리되는 참조를 쉽게 전환 할 수 있기를 원합니다. 어쩌면 같은 다음은 :

public enum EnumEmguCvTarget 
{ 
    None, // Do not use EmguCv 
    EmguCvTargetTbb86, // Target EmguCv for x86 without GPU. 
    EmguCvTargetGpu86, // Target EmguCv for x86 with GPU. 
    EmguCvTargetTbb64, // Target EmguCv for x64 without GPU. 
    EmguCvTargetGpu64, // Target EmguCv for x64 with GPU. 
} 

public EnumEmguCvTarget EmguCvTarget 
{ get { return (EnumEmguCvTarget.EmguCvTargetGpu64); } } 

내가 컴파일 시간 (늦은 바인딩되지 않음)에서 이러한 어셈블리를 참조하고 있기 때문에, 내가 프로그래밍 방식 [EmguCvTarget]의 값에 따라 버전 사이를 전환 할 수있는 방법은 무엇입니까?

+0

그것은 작동하지 않을 것이다. x64 라이브러리를 참조하고 사용하는 dll은 x86 라이브러리를 동시에로드하거나 참조 할 수 없다. 인터페이스 프로젝트 (AnyCPU)를 만든 다음 리플렉션을 통해 어셈블리를로드하고 인터페이스에 캐스트 한 다음 아무 일도 일어나지 않은 것처럼 사용할 수 있습니다. – jessehouwing

+0

@jessehouwing : 고마워요. '인터페이스 프로젝트 '에 대해 자세히 설명해 주시겠습니까? 또한 리플렉션에 의지하는 경우 초기 바인딩과 같은 Intellisense 작업을 계속 수행 할 수있는 방법이 있습니까? –

+0

그렇습니다. 인터페이스의 전체적인 아이디어는 다음과 같습니다. – jessehouwing

답변

1

1 단계 : 사용중인 개체에 대한 인터페이스를 EmguCv에 만들고이를 각각 AnyCpu 프로젝트에 배치하십시오. 이러한 객체에 대한 공통 인터페이스가 없거나 객체를 변경할 수없는 경우 이러한 클래스에 대한 자체 래퍼 객체를 만들어야합니다. 자신의 모든 코드에서이 어셈블리를 참조하므로 이러한 인터페이스가 자체 어셈블리에 정의되어 있어야합니다. 여기에서

// which assembly to load depends on your configuration 
Assembly emguAssembly = Assembly.Load("EmguX64"); 
Type emguType = emguAssembly.GetType("EmguCvClassYouAddedInterfacesTo"); 
IEmguCv object = (IEmguCv)Activator.CreateInstance(emguType); 

당신이 IEmguCv 인터페이스를 사용할 수 있습니다, 모든 강력한 바인딩, 인텔리과를 제공합니다 :

public interface IEmguCv{ /* methods and proeprties */ } 
public class EmguCv : IEmguCv { } 
기존 응용 프로그램, 사용 반사에 지금

또는 Activator.CreateInstance 올바른 어셈블리를로드하는 당신이 기대할 수있는 다른 것들이 있지만, 당신이 가지고있는 컨텍스트를 기반으로 어셈블리를 동적으로로드 할 수 있습니다.

EmguCv 개체에서 기본이 아닌 생성자를 호출해야한다면 Activator.CreateInstance(Type, Object[], Object[]) 오버로드를 사용하거나 Type.GetConstructor(Type[]).Invoke()을 통해 생성자를 호출 할 수 있습니다.

인터페이스가 정의되면 Unity 또는 NInject와 같은 라이브러리를 사용할 수도 있습니다. 따라서 이러한 DI 컨테이너를 사용하여 리플렉션 작업을 수행 할 수 있습니다.