PInvoke, когда вы не знаете DLL во время компиляции? - PullRequest
7 голосов
/ 30 сентября 2011

В C # я пытаюсь вызвать "простую" функцию, которая есть в C ++. Проблема в том, что я не знаю имя или местоположение библиотеки во время компиляции. В C ++ это легко:

typedef HRESULT (*SomeFuncSig)(int, IUnknown *, IUnknown **);

const char *lib = "someLib.dll";  // Calculated at runtime

HMODULE mod = LoadLibrary(lib);
SomeFuncSig func = (SomeFuncSig)GetProcAddress("MyMethod");

IUnknown *in = GetSomeParam();
IUnknown *out = NULL;
HRESULT hr = func(12345, in, &out);

// Leave module loaded to continue using foo.

Ради жизни я не могу понять, как это сделать в C #. У меня не было бы никаких проблем, если бы я знал имя DLL, это выглядело бы что-то как это:

[DllImport("someLib.dll")]
uint MyMethod(int i,
              [In, MarshalAs(UnmanagedType.Interface)] IUnknown input, 
              [Out, MarshalAs(UnmanagedType.Interface)] out IUnknown output);

Как мне это сделать, не зная dll, из которой я загружаюсь во время компиляции?

Ответы [ 3 ]

7 голосов
/ 30 сентября 2011

Вы делаете это так же.Объявите тип делегата, чья сигнатура соответствует экспортируемой функции, как SomeFuncSig.Pinvoke LoadLibrary и GetProcAddress, чтобы получить IntPtr для экспортируемой функции, как вы это делали в C ++.Затем создайте объект делегата с помощью Marshal.GetDelegateForFunctionPointer ().

5 голосов
/ 30 сентября 2011

Здесь есть решение: Динамический вызов неуправляемой dll из .NET (C #) (на основе LoadLibrary / GetProcAddress)

1 голос
/ 27 марта 2012

Если вы заранее знаете имя DLL и заранее знаете имена функций, есть более простой способ.

Вы можете просто объявить подписи P / Invoke, а затем использовать LoadLibrary для загрузки DLL на основе, например, записи в файле конфигурации. Пока вы успешно вызываете LoadLibrary до использования любой из функций P / Invoke, они будут успешными, поскольку DLL уже загружена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...