2016-09-26 3 views
0

Мне нужно создать библиотеку C# для использования стороннего приложения, которое является COM-объектом. В настоящее время приложение находится в двух вариантах Version 1 (старый) и Version 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; } 
    } 
} 

ProgID для Sample1.dll является Sample.Application.1 и Sample2.dll является Sample.Application. 2 соответственно.

Теперь я хочу передать любую версию 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); 
    } 
} 

Приведенный выше код работает, если я см

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

Но я хочу, чтобы динамически изменять DLL образца на основе ProgID и использовать интерфейс IApplication.

В принципе, я хочу написать код, поддерживающий две версии dll (Sample1.dll и Sample2.dll).

+0

Можете ли вы псевдоним dll другим именем .. вы знакомы с Alias ​​в отношении .DLL/namespace ..? – 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.dll и Sample2.dll как ссылки, используя псевдонимы, но это приведет к гораздо более сложному коду.

Смежные вопросы