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

Этот вопрос связан с моим предыдущим вопросом - динамически запускать DLL в удаленном окне Windows? Прежде всего, спасибо за все ваши полезные идеи.

Я нашел способ запустить DLL на удаленном компьютере.

Теперь я пытаюсь сделать следующее:
(1) отправить DLL на удаленную машину.
(2) отправить команду на удаленную машину, чтобы запустить функцию вDLL.
Команда может содержать такие вещи, как (a) параметры DLL (2) точки входа функции location (2).

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

Есть ли у вас какие-либо предложения о том, как эффективно связать функцию DLL с неизвестными типами возвращаемых данных и неизвестными параметрами?Должен ли я просто наложить ограничения на то, какие функции может выполнять удаленный компьютер?

Вот мой фрагмент кода в C # ...

[DllImport("kernel32")]
public extern static IntPtr LoadLibrary(string dllToLoad);

[DllImport("kernel32")]
public extern static Boolean FreeLibrary(IntPtr hModule);

[DllImport("kernel32")]
public extern static IntPtr GetProcAddress(IntPtr hModule, string procedureName);

// THIS IS THE PART THAT I HAVE A PROBLEM WITH.
// Since I want to bind MyFunction to just about any function in a DLL, I sure cannot declare the following as something like "double". 
// Also there could just be any combinations of parameters (e.g. int, string, double..) 
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate double MyFunction(int arg); 

1 Ответ

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

Вы можете использовать типы функций

public delegate TResult Func<TResult>();
public delegate TResult Func<T, TResult>(T arg);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
public delegate TResult Func<T1, T2, T3, TResult>
    (T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<T1, T2, T3, T4, TResult>
    (T1 arg1, T2 arg2, T3 arg3, T4 arg4);

После создания типа делегата вы можете использовать Marshal.GetDelegateForFunctionPointer http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer(VS.80).aspx

Редактировать: см. Этот пост Генерация типов делегатовдинамически в C #

...