Я знаю, что это был старый пост, но есть ответ: используя функцию LoadLibary
, вы можете принудительно загрузить собственную DLL:
public static class Loader
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string fileName);
}
Вы должны вызывать это раньше, чем любая другая DLL - я обычно вызываю это в статическом конструкторе моей основной программы. Я должен был сделать это для DllImport()
, и статические конструкторы всегда выполнялись до загрузки собственных DLL-файлов - они загружаются фактически только при первом вызове импортированной функции.
Пример:
class Program
{
static Program()
{
Loader.LoadLibrary("path\to\native1.dll");
Loader.LoadLibrary("otherpath\to\native2.dll");
}
}
После загрузки библиотеки она должна удовлетворять DllImports()
других управляемых сборок, которые вы загружаете. В противном случае они могут быть загружены с использованием другого метода, и у вас может не быть другого выбора, кроме как скопировать их локально.
Примечание: Это решение только для Windows. Чтобы сделать это более кроссплатформенным, вам придется самостоятельно определять операционные системы и использовать правильный импорт; например:
[DllImport("libdl")]
public static extern IntPtr DLOpen(string fileName, int flags);
[DllImport("libdl.so.2")]
public static extern IntPtr DLOpen2(string fileName, int flags);
// (could be "libdl.so.2" also: https://github.com/mellinoe/nativelibraryloader/issues/2#issuecomment-414476716)
// ... etc ...