C#调用非托管代码(C++方法)的2种方式
2013-05-14 15:53
381 查看
第一种:静态调用
使用using System.Runtime.InteropServices命名空间下的DllImport标签指定非托管的Dll及其细节
方法必须是静态的即必须加上static关键字,还有extern关键字
调用时与普通的静态方法一致;
第二种:动态加载
动态加载时需要使用的一些非托管代码
首先定义相应的代理对应的非托管代码(dll)中的相关方法(我们需要的方法)
再动态加载非托管代码
调用时先DLLHandler.Init();
再使用DLLHandler.dicCreateHDICT()等方法
使用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()等方法
相关文章推荐
- C#调用C++的DLL 所有数据类型转换方式
- C#调用C++ DLL类方法(转)
- c#调用c++带有回调函数方法的实现
- Android 平台C# 与C++之间的互相调用方法
- C++ 调用C#工程的 dll , 互相调用方法
- C#调用C++动态链接库方法介绍
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- C++与C#编写的DLL/COM的各种调用方法
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- 在C#调用C++的DLL方法(二)生成托管的DLL
- C#错误:不能以方法的方式使用不可调用的
- C#调用C++封装的DLL调试方法小结
- C#调用C++的dll文件方法
- C#托管代码与C++非托管代码互相调用一(C#调用C++代码&.net 代码安全)
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- C#导出非托管方法供C/C++调用
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- C#调用C++接口提示找不到指定的模块解决方法,本机正常
- C#调用C++方法,C#使用c++方法返回类或结构体
- C#调用C++ DLL类方法