HINSTANCE m_hLibrary;
m_hLibrary=LoadLibrary("mydll.dll");
typedef int(_cdecl *Connect)(int,int,int); //调用的是一个int fun(int,int,int)的函数
Connect Proc;
Proc = (Connect)GetProcAddress(m_hLibrary,"fun");
int x=Proc(3,4,25);
FreeLibrary(m_hLibrary=LoadLibrary("mydll.dll");这是一段VC写的显式调用Win32动态库的代码,哪位高手能将代码改写成C#的

解决方案 »

  1.   

    只能给你指个路,使用委托DllImport,在CSDN查查怎么用。
      

  2.   

    我当然知道可以用DllImport方法调用API,但那样没办法满足我的需求,我需要动态的加载,有没有高手可以帮我?
      

  3.   

    DllImport相当于动态的加载
    如果程序中不调用DllImport声明函数的话,dll也不会加载,在C#中也只有用此方法来调用。
      

  4.   

    关键是我的服务要用到5至10个DLL文件,这些DLL文件实际都一样,就是文件名不同,如myDLL1.dll、myDLL2.dll、myDLL3.dll...,我想把调用这些DLL的方法封装成一个类,但用DllImport加载DLL好像办不到
      

  5.   

    Knight94(愚翁)说的很清楚了 到5至10个DLL文件 就dllimport5-10次
      

  6.   

    如果你的dll是用dotnet写的,那么还可以用Assembly来加载,但是你要调用vc写的dll,只能自己一个个写了
      

  7.   

    [DllImport("mydll.dll")]
    static extern int GetProcAddress ( 
     int iX,
             int iY,
             int iZ)
      

  8.   

    //*************别处贴过来的string DllPath = Application.StartupPath + @"someDLL.dll";
    System.Reflection.Assembly assmble = System.Reflection.Assembly.LoadFile(DllPath);
    Type tmpType = assmble.GetType("someDLL.ClassA");
    System.Reflection.MethodInfo tmpM = tmpType.GetMethod("Add");
    object tmpobj = assmble.CreateInstance("someDLL.ClassA");
    int i = (int)tmpM.Invoke(tmpobj, new object[]{2,3});
    ----------ClassA的定义--------------------
    using System;
    namespace someDLL
    {
    /// <summary>
    /// ClassA 的摘要说明。
    /// </summary>
    public class ClassA
    {
    public ClassA()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    public int Add(int a, int b)
    {
    return a+b;
    }
    }
    }
      

  9.   

    public class DynamicBeeper
    {
    private DynamicBeeper()
    {
    }
                      static void Main()
                      {
                         object b = (bool)DynamicBeeper.DynamicPInvoke("user32.dll", "MessageBeep", typeof(bool), 
    new Type[]{ typeof(uint) }, new Object[]{ (uint)0 });
                      }
    public static object DynamicPInvoke(string dll, string entryPoint, 
    Type returnType, Type [] parameterTypes, object [] parameterValues)
    {
    // Create a dynamic assembly and a dynamic module
    AssemblyName asmName = new AssemblyName();
    asmName.Name = "tempAssembly";
    AssemblyBuilder dynamicAsm = 
    AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, 
    AssemblyBuilderAccess.Run);
    ModuleBuilder dynamicMod = 
    dynamicAsm.DefineDynamicModule("tempModule"); // Dynamically construct a global PInvoke signature 
    // using the input information
    MethodBuilder dynamicMethod = dynamicMod.DefinePInvokeMethod(
    entryPoint, dll, MethodAttributes.Static | MethodAttributes.Public
    | MethodAttributes.PinvokeImpl, CallingConventions.Standard,
    returnType, parameterTypes, CallingConvention.Winapi, 
    CharSet.Ansi); // This global method is now complete
    dynamicMod.CreateGlobalFunctions(); // Get a MethodInfo for the PInvoke method
    MethodInfo mi = dynamicMod.GetMethod(entryPoint); // Invoke the static method and return whatever it returns
    return mi.Invoke(null, parameterValues);
    }
    }
    我找到动态加载的方法了,但是返回值还有点问题