C#通過相對路徑調用C++的dll

本文介绍了一种在C#中动态加载DLL文件并调用其内部函数的方法。通过使用[DllImport]属性导入kernel32.dll中的LoadLibrary、GetProcAddress和FreeLibrary函数,可以实现对DLL的加载、函数获取和释放。此外,还提供了一个具体的示例,展示了如何定义委托来调用DLL中的特定函数。

首先我们用[DllImport("kernel32.dll")]private extern static IntPtr LoadLibrary(String path);[DllImport("kernel32.dll")]private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);[DllImport("kernel32.dll")]private extern static bool FreeLibrary(IntPtr lib);分别取得了LoadLibrary和GetProcAddress函数的地址,再通过这两个函数来取得我们的DLL里面的函数。我们可以先用Server.MapPath(@"~/Bin/Judge.dll")来取得我们的DLL的物理路径,然后再用LoadLibrary进行载入,最后用GetProcAddress取得要用的函数地址以下自定义类的代码完成LoadLibrary的装载和函数调用:

public class DllInvoke    {            

   [DllImport("kernel32.dll")]      

  private extern static IntPtr LoadLibrary(String path);  

     

 [DllImport("kernel32.dll")]       

 private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);       

 

 [DllImport("kernel32.dll")]       

 private extern static bool FreeLibrary(IntPtr lib);       

 

 private IntPtr hLib;       

 

public DllInvoke(String DLLPath)       

 {           

 hLib = LoadLibrary(DLLPath);       

}       

 

 ~DllInvoke()       

{           

 FreeLibrary(hLib);               

    }      

 

  //将要执行的函数转换为委托      

  public Delegate Invoke(String APIName,Type t)        

 {           

IntPtr api = GetProcAddress(hLib, APIName);           

 return (Delegate)Marshal.GetDelegateForFunctionPointer(api,t);       

}

}

 

 

我自己使用的代碼:

        [DllImport("kernel32.dll")]
        private extern static IntPtr LoadLibrary(String path);
        [DllImport("kernel32.dll")]
        private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
        [DllImport("kernel32.dll")]
        private extern static bool FreeLibrary(IntPtr lib);

 

        public delegate int GetFileId([MarshalAs(UnmanagedType.LPTStr)] StringBuilder fileName, [MarshalAs(UnmanagedType.LPTStr)]  StringBuilder certSubjectName);

 

       

 

        public static bool invokeDLL(string filename)
        {
            IntPtr hLib;
            string dllPath = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "GetFileId.dll");
            hLib = LoadLibrary(dllPath);

            IntPtr api = GetProcAddress(hLib, "GetFileId");
            GetFileId getFileId = (GetFileId)Marshal.GetDelegateForFunctionPointer(api, typeof(GetFileId));
            long fileId = getFileId(new StringBuilder(filename), new StringBuilder(FTPNET.certValidator.CertName));

            FreeLibrary(hLib);      

        }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值