Edit:
Если промежуточная DLL является сборкой .NET, вы можете использовать метод, упомянутым here указать, где искать для промежуточной DLL перед тем вызова любого метода, который использует промежуточный DLL , без необходимости менять существующий код.
то вы не должны напрямую ссылаться на DLL в своем проекте C#, потому что .Net Assemblies обнаружены и загружены до того, как ваш метод Main
даже называется. Вместо этого вы должны динамически загружать промежуточную DLL с помощью AppDomain
или другими способами, затем использовать библиотеку через отражение или используя объекты dynamic
.
По-видимому, это сделало бы программирование очень громоздким. Однако существует альтернативный метод. Вы можете написать программу запуска , которая загружает ваше исходное приложение (вы можете загружать файлы .exe в виде библиотек) и вызывает рефлексивный метод вашей оригинальной программы Main
. Чтобы загрузить правильную промежуточную DLL, вы можете использовать упомянутый метод here, в то время как ваша программа запуска загружает ваше оригинальное приложение.
Следующее обсуждение по-прежнему относится к аппаратной DLL.
Следующая является действительным, если:
- Вам нужно только одну версию DLL в то время (в течение всего периода запускает приложение), и
- Две версии промежуточного DLL имеют точно такой же API.
Согласно MSDN, путь поиска DLL включает каталоги, указанные в переменной среды PATH. (http://msdn.microsoft.com/en-us/library/7d83bc18%28v=vs.80%29.aspx).Таким образом, вы можете поместить две версии промежуточных библиотек DLL под отдельными подкаталогами в вашем каталоге приложения, но с точно таким же именем, под каждую директорию, например:
bin\
hardware-intermediate-v1\
intermediate.dll
hardware-intermediate-v2\
intermediate.dll
Затем, при запуске, после того, как ваши приложение определило, какую версию использовать, вы можете добавить один из указанных выше каталогов в переменную окружения PATH,
using System;
using System.Reflection;
using System.IO;
...
Environment.SetEnvironmentVariable(
"PATH",
Environment.GetEnvironmentVariable("PATH") + ";" +
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) +
"\\hardware-intermediate-v1"
);
Тогда, вызовы методов P-Invoke (DllImport) приведет к соответствующей версии DLL к загружаться. Чтобы сразу загрузить все DLL-файлы, вы можете обратиться к DllImport, how to check if the DLL is loaded?.
Однако, если вы хотите использовать две версии DLL вместе, не перезагружая приложение, или если есть какая-либо разница API между двумя DLL на уровне имени метода и/или параметра count/type, вы должны создайте два отдельных набора методов P-Invoke, каждый из которых привязывается к соответствующей версии промежуточной DLL.
Сначала вам нужно определить, какое оборудование вы планируете. Вы еще это решили? –
Я могу либо сделать это с помощью раскрывающегося списка - или, в идеале, путем загрузки одной DLL и сканирования на аппаратное обеспечение, затем загрузки другой DLL и сканирования аппаратного обеспечения .. если возможно .. – Mark
Является промежуточной DLL родной DLL? – Dennis