2016-09-26 5 views
0

COM 개체 인 타사 응용 프로그램을 사용하려면 C# 라이브러리를 만들어야합니다. 현재 응용 프로그램은 아래에 언급과 같은 두 가지 버전 버전 1 (구) 및 버전 2 (신규),사용자 입력에 따라 런타임에 동적으로 dll을 변경하십시오.

Version 1 (Sample1.dll) 

namespace Sample 
{ 
    public interface IApplication 
    { 
     string Version { get; } 
    } 
} 

Version 2 (Sample2.dll) 

namespace Sample 
{ 
    public interface IApplication 
    { 
     string Version { get; } 
    } 
} 

Sample1.dll의 ProgID를가 Sample.Application.1하고 Sample2.dll이 Sample.Application입니다입니다. 2를 각각 나타낸다.

이제 프로젝트의 dll 버전을 참조하고 IApplication 인터페이스를 사용하고 싶습니다. 내가

1. Sample1.dll and use Sample.Application.1 as ProgID 
2. Sample2.dll and use Sample.Application.2 as ProgID 

를 참조하지만 난 동적으로 ProgID를 기반으로 샘플 DLL을 변경하고 IApplication 인터페이스를 사용하려는 경우

static void Main(string[] args) 
{ 
    int version = 0; 
    if (int.TryParse(Console.ReadLine(), out version)) 
    { 
     Type comType = Type.GetTypeFromProgID(String.Format("Sample.Application.{0}", version)); 
     object item = Activator.CreateInstance(comType); 

     IApplication application = item as IApplication; 

     Console.WriteLine("Version: {0}", application.Version); 
    } 
} 

위의 코드

작동합니다.

기본적으로 두 가지 버전의 dll (Sample1.dll 및 Sample2.dll)을 지원하는 코드를 작성하고 싶습니다.

+0

다른 이름으로 dll을 별칭으로 지정할 수 있습니까? .DLL/namespace와 관련하여 Alias에 익숙합니까? – MethodMan

+0

내 이해대로, 별칭을 사용하는 경우 두 버전의 코드에 대한 코드를 복제해야합니다. 제 경우에는 두 버전을 모두 지원하는 단일 코드를 작성해야합니다. – Babu

답변

0

최상의 솔루션은 코드에서 작성할 수있는 자신 만의 프록시 클래스를 만드는 것입니다. 프록시 생성자에서 원하는 버전을 지정할 수 있습니다.

아래 예제에서는 dynamic을 사용하는 쉬운 경로를 사용했지만 컴파일 타임 유형 안정성이 느슨하지만 모든 구성원이 프록시 멤버와 동일한 이름이어야하므로 함수 또는 속성 이름을 복사하여 붙여 넣기가 쉽습니다 . Sample1.dll 또는 Sample2.dll이 참조로 추가되지 않았습니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     int version = 0; 
     if (int.TryParse(Console.ReadLine(), out version)) 
     { 
      IApplication application = new ApplicationProxy(version); 

      Console.WriteLine("Version: {0}", application.Version); 
     } 
    } 
} 

/// <summary> 
/// A copy of IApplication that is local to your program that holds the shared members. 
/// This is what the rest of your program will likely use. 
/// </summary> 
public interface IApplication 
{ 
    string Version { get; } 
} 

public class ApplicationProxy : IApplication 
{ 
    private readonly dynamic _application; 
    public ApplicationProxy(int version) 
    { 
     Type comType = Type.GetTypeFromProgID(String.Format("Sample.Application.{0}", version)); 
     _application = Activator.CreateInstance(comType); 
    } 

    public string Version 
    { 
     get { return _application.Version; } 
    } 
} 

당신은 dynamic 제거하고 별칭을 사용하여 참조로 모두 Sample1.dllSample2.dll을 추가하지만 훨씬 더 복잡한 코드가 발생합니다 얻을 수 있습니다.

관련 문제