在下面的代码中,我在运行时加载dll。 但问题是DLL中可用的方法的结果在运行时可用。
例如,对于具有一个参数(SetForegroundWindow)的方法,我应该声明 委托int MyFunc(IntPtr a);
对于没有参数的方法(GetForegroundWindow),我应该声明 委托int MyFunc();
考虑以下C#代码:
public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
delegate int MyFunc(IntPtr a);
// private static extern IntPtr GetForegroundWindow();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
String strDLL = "user32.dll";
// Load the DLL library.
IntPtr iModule = LoadLibrary(strDLL);
// Retrieve the function pointer.
IntPtr pProc = GetProcAddress(iModule, "SetForegroundWindow");
// Delegate method.
// Convert the function pointer to delegate method.
MyFunc pFunc = (MyFunc)Marshal.GetDelegateForFunctionPointer(pProc, typeof(MyFunc));
// Execute the function.
int iRes = pFunc.Invoke((IntPtr)132462);
// Unload the DLL library.
FreeLibrary(iModule);
}
}
}
这里点击按钮我想动态声明委托,并根据某个文本框中的数据在运行时调用该方法。
我该怎么做
答案 0 :(得分:0)
在CLR边界上编组参数和返回类型通常很棘手 - 我不确定typeof()是否会这样做,因为它将返回外部函数无法理解的CLR类型......我可能是错的。这些类型通常表示为Windows类型。本页讨论了大部分内容:http://www.codeproject.com/Articles/66244/Marshaling-with-C-Chapter-Marshaling-Simple-Type。
希望这有帮助。