C#调用非托管代码(C++方法)的2种方式

第一种:静态调用  

使用using System.Runtime.InteropServices命名空间下的DllImport标签指定非托管的Dll及其细节

方法必须是静态的即必须加上static关键字,还有extern关键字

  [DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLCID")]
        static extern ushort GetSystemDefaultLCID();//OS 当前选择的默认语言(区域-管理)
        [DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLangID")]
        static extern ushort GetSystemDefaultLangID();//OS 当前选择的默认语言(区域-管理)

调用时与普通的静态方法一致;

第二种:动态加载

动态加载时需要使用的一些非托管代码

        //装载动态库
        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
        //获取要引入的函数
        [DllImport("kernel32.dll")]
        static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
        //释放动态链接库
        [DllImport("kernel32.dll", EntryPoint = "FreeLibrary", SetLastError = true)]
        static extern bool FreeLibrary(IntPtr hModule);

 

首先定义相应的代理对应的非托管代码(dll)中的相关方法(我们需要的方法)

    public delegate int dicCreateHDICT(int dwWordLangID, string lpcszIdxFileName, string lpcszDatFileName);
    public delegate bool dicFreeHDICT(int hdict);

再动态加载非托管代码

  public class DLLHandler
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
        //获取要引入的函数
        [DllImport("kernel32.dll")]
        static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
        //释放动态链接库
        [DllImport("kernel32.dll", EntryPoint = "FreeLibrary", SetLastError = true)]
        static extern bool FreeLibrary(IntPtr hModule);
        //DrDicEnt.dll
        public static dicCreateHDICT dictCreateDICT = null;
        public static dicFreeHDICT dictFreeDict = null;
        public static void Init()
       {
         IntPtr hLib=LoadLibrary(@"D:\Dll\DrDicEnt.dll");
         IntPtr api = GetProcAddress(hLib,"dicCreateHDICT");
     dictCreateDICT = (dicCreateHDICT)Marshal.GetDelegateForFunctionPointer(api,typeof(dicCreateHDICT));
 IntPtr api2 = GetProcAddress(hLib,"dicFreeHDICT");
     dicFreeHDICT= (dicFreeHDICT)Marshal.GetDelegateForFunctionPointer(api2,typeof(dicFreeHDICT));

}

调用时先DLLHandler.Init();
再使用DLLHandler.dicCreateHDICT()等方法

 

转载于:https://www.cnblogs.com/wxj111/archive/2013/05/14/3077943.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值