2010-09-09 2 views
0

Я работаю над приложением C#, которое поддерживает два интерфейса связи, каждый из которых поддерживается собственной DLL. Каждая DLL содержит те же имена функций, но их реализация несколько меняется в зависимости от поддерживаемого интерфейса. Как правило, у пользователей обычно будет только одна DLL, установленная на их машине, а не обе. DLL для старого интерфейса импортируется так:Динамически загружать библиотеки DLL в Runtime

[DllImport("myOldDll.dll", 
      CharSet = CharSet.Auto, 
      CallingConvention = CallingConvention.StdCall)] 
public static extern int MyFunc1(void); 
public static extern int MyFunc2(void); 
public static extern int MyFunc3(void); 

Будет ли это правильный способ, чтобы попытаться принести в любом DLL?

[DllImport("myOldDll.dll", 
     CharSet = CharSet.Auto, 
     CallingConvention = CallingConvention.StdCall)] 
[DllImport("myNewDll.dll", 
     CharSet = CharSet.Auto, 
     CallingConvention = CallingConvention.StdCall)] 
public static extern int MyFunc1(void); 
public static extern int MyFunc2(void); 
public static extern int MyFunc3(void); 

В идеале, я полагаю, было бы неплохо, чтобы обнаружить недостающие DLL и загрузить второй DLL, если попытаться загрузить первый сбой. Есть ли изящный способ сделать это?

ответ

0

Как насчет выполнения P/Invoke для `LoadLibrary '?

+0

и waht вы бы сделали с полученной ручкой? GetProcAddress и что дальше? –

+0

Ничего. Если бы я получил дескриптор, я бы выпустил его и позвонил через extern, который использует это имя DLL. Если нет, я бы попробовал со следующей DLL. –

0

В .NET 1.1 вам нужно будет создать прокси-неуправляемую DLL (записать его на C или Delphi или ...) и вызвать его методы, и эта неуправляемая DLL сделает все остальное. В .NET 2.0 и более поздних версиях вы используете Assembly.LoadFile() и далее. Не такой элегантный, как просто объявления, которые вы пытались использовать, и требует довольно много кодирования. Поэтому, если возможно, я предлагаю прокси-сервер.

0

Возможно, вам следует предоставить методы, импортированные из разных имен DLL, а затем иметь делегат в вашей программе, который вы указываете на один или другой (в зависимости от того, что подходит), и вызывать только делегата.

+0

Нет никакой причины, чтобы DLL экспортировала разные имена: вы можете ссылаться на них по ссылке. –

0

Похоже, что вам лучше всего перестроить архитектуру в модульный интерфейс стиля плагина.

В Интернете представлено несколько с половиной миллионов примеров, like this one. В двух словах, вы используете LoadAssembly() в каталоге DLL, а затем отбрасываете свой общий базовый интерфейс.