Я смог получить эту работу после прочтения комментария Викитора о FreeLibrary ().
Я использовал этот класс , созданный Майком Сталлом, который предоставляет обертки для LoadLibrary, GetProcAddress и FreeLibrary.,Таким образом, я могу загрузить библиотеку один раз в каждом тестовом прогоне, вызвать необходимые методы, а затем освободить библиотеку в конце тестового прогона.
Код Майка Сталла использует Marshal.GetDelegateForFunctionPointer , который преобразует указатель неуправляемой функции в управляемый тип делегата.
Мне пришлось заменить внешние объявления [DllImport] объявлениями для типов делегатов.Поэтому я преобразовал это:
[DllImport("asesignal.dll")]
public static extern bool ASESDK_Initialize(string licenseCode);
в это:
public delegate bool ASESDK_Initialize(string licenseCode);
Код Майка Сталла содержал примеры с обобщенными делегатами (действие и т. Д.).Но я не смог заставить это работать, поэтому я создал свои собственные типы делегатов.
Я могу динамически загружать DLL следующим образом:
_ht = new UnmanagedLibrary(@"c:\windows\system32\asesignal.dll");
Чтобы вызвать функцию, я делаю это:
var function = _ht.GetUnmanagedFunction<ASESDK_Initialize>("ASESDK_Initialize");
function(licenseCode);
Спасибо Wiktor и np-hard за помощь!