动态绑定DLL函数与未知的返回类型和参数

时间:2010-09-07 05:39:31

标签: c# dll unmanaged dllimport

此问题与我之前提出的问题有关 - dynamically running a DLL at a remote Windows box? 首先,感谢您提供的所有有用见解。

我找到了一种在远程计算机上运行DLL的方法。

现在我要做的是如下 (1)将DLL发送到远程机器 (2)向远程机器发送命令以在DLL中运行函数。
命令可能包含诸如(a)DLL的位置(2)函数入口点(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); 

1 个答案:

答案 0 :(得分: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#