在C#中,你不需要使用函数指针,同时C#的DLL也非传统意义上的DLL了,如果你需要调用WIN API,你可以使用Interop, 下面是调用API的MessageBox函数的代码片断,你可以试试:using System.Runtime.InteropService //加上名空间
.......//这里是你要使用的API 函数[DllImport("User32.dll")]  //可以是你要调用的DLL
public static extern int MessageBox(int hParent,string message,string caption, int type);现在你可以在你的程序中调用这个MessageBox就象它是C#写的一样。

解决方案 »

  1.   

    Good Question! :)
    我也想过这个问题,因为有时候我们希望能够动态的调用DLL里面的函数,DllImport就不勘用了。这也就是API里面LoadLibrary和GetProcAddress的来由。但不幸的是,答案是几乎办不到:
    首先,Method在Managed和unmanaged世界里的转换并不那么直截了当,中间需要一个转换过程(或者叫Marshal),也就是要一段Thunk代码,对动态调用的情形,我们要自己动手,生成这个转换代码(麻烦!!!)。
    幸好,.NET倒是提供了一些手法的,Marshal类是个好东东:
      Marshal.GetManagedThunkForUnmanagedMethodPtr
    可是它的参数和返回值还有麻烦:MethodSignature要你自己从SignatureHelper类里面自己生成,这个还好,返回值居然是一个IntPtr!!!
      应该肯定这个IntPtr就是Thunk代码的函数指针,但是MSDN在这个问题上有些含混不清。问题是,我们需要一个函数指针到Delegate的转换!IL里面可以直接使用Calli指令调用函数,但C#里就没办法了。
      我卡在了这里,没有进一步的发现。但可以肯定用MSIL写程序直接调用是成功的。所以,有两个可能的解决办法,一使用reflection生成calli指令来调用,二是用MSIL写一个Wrap,通过它来调用。这个没试过,不置可否。
      

  2.   

    找到了!
    答案再Reflection里,用TypeBuilder.DefinePInvokeMethod!
      

  3.   

    谢谢qqchen79(知秋一叶).谢谢大家
    我到时测试一下,我现在的解决办法是将那个动态调用放在delphi里面做的.