Динамическая загрузка DLL во время выполнения - PullRequest
0 голосов
/ 09 сентября 2010

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

[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, если попытка загрузить первую не удалась. Есть ли изящный способ сделать это?

Ответы [ 5 ]

0 голосов
/ 10 сентября 2010

Мне кажется, я нашел работоспособное решение:

C # проверка правильности назначения файла

Спасибо всем за ваш вклад!

0 голосов
/ 10 сентября 2010

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

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

0 голосов
/ 09 сентября 2010

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

0 голосов
/ 09 сентября 2010

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

0 голосов
/ 09 сентября 2010

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

...