2010-09-07 4 views
1

Этот вопрос связан с моим предыдущим вопросом - dynamically running a DLL at a remote Windows box? Прежде всего, спасибо за все ваши полезные советы.Динамическое связывание функции DLL с неизвестными типами и параметрами возврата

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

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

Проблема в том, что ... в данной 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); 

ответ

0

Вы можете использовать типы Func

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

Редактировать: ссылка на это сообщение Generating Delegate Types dynamically in C#