如何在运行时声明Delegate并在C#中在运行时调用其方法?

时间:2015-06-26 13:27:39

标签: c# reflection delegates runtime marshalling

在下面的代码中,我在运行时加载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);
}





}

}

这里点击按钮我想动态声明委托,并根据某个文本框中的数据在运行时调用该方法。

我该怎么做

1 个答案:

答案 0 :(得分:0)

乍一看标题,我想建议使用CodeDom(并跳入),但看了你的代码示例,看起来你试图从外部非托管库导入非托管函数。我还没有进一步研究过这个问题,但我确信你必须将代码块放在unsafe语句中,以防止CLR破坏非托管内存段。

在CLR边界上编组参数和返回类型通常很棘手 - 我不确定typeof()是否会这样做,因为它将返回外部函数无法理解的CLR类型......我可能是错的。这些类型通常表示为Windows类型。本页讨论了大部分内容:http://www.codeproject.com/Articles/66244/Marshaling-with-C-Chapter-Marshaling-Simple-Type

希望这有帮助。