当前位置: 首页 > news >正文

江宁外贸网站建设泰安有几个区

江宁外贸网站建设,泰安有几个区,dw建设网站如何加入音乐,溧阳网站优化这两天忙着把框架改为支持加载C和Delphi的插件#xff0c;来不及更新blog了。 原来的写的框架只支持c#插件#xff0c;这个好做#xff0c;直接用c#的反射功能便可。但是公司不是所有人都搞C##xff0c;也不是所有的程序C#都能很好的完成#xff0c;又或者其他公司…      这两天忙着把框架改为支持加载C和Delphi的插件来不及更新blog了。       原来的写的框架只支持c#插件这个好做直接用c#的反射功能便可。但是公司不是所有人都搞C#也不是所有的程序C#都能很好的完成又或者其他公司提供的API不是C#的这个时候就需要这个框架能够支持多种语言了。       废话不多说进入正题。      上网一搜C#加载非托管的dll无非就是使用 DllImportAttribute 。然而这个属性里面要指明dll所在的路径因为又是写在属性中因此是在编译的时候就已经把路径写死了不能动态指定路径加载。      于是又找了下终于发现了c#中的一个函数Marshal.GetDelegateForFunctionPointer。这个函数的功能就是将非托管的函数指针转换为委托。至此任务完成。Dll的功能无非提提供各种函数组成所谓的API有了上述的方法之后在C#中定义相关的委托方法的参数列表和参数类型要跟非托管的Dll的参数类型和参数列表对应具体的对应请google然后调用上述方法将非托管的dll转换为相应的委托这样就能调用非托管的dll了。       在C#中我们定义相关的接口在方法实现中调用相应的委托这样一个插件对象就完成了。下面给出相应的类库和使用实例。 1     public class LoadDll  2     {  3         #region Win32 API : Load dll  4         [DllImport(kernel32.dll)]  5         public static extern IntPtr LoadLibrary(string path);  6   7         [DllImport(kernel32.dll)]  8         public static extern IntPtr GetProcAddress(IntPtr lib, string funcName);  9  10         [DllImport(kernel32.dll)] 11         public static extern bool FreeLibrary(IntPtr lib); 12  13         [DllImport(kernel32.dll)] 14         public static extern IntPtr GetStdHandle(int nStdHandle); 15  16         [DllImport(user32, EntryPoint  CallWindowProc)] 17         public static extern int CallWindowProc(IntPtr lpPreWndFunc, int hwnd, int msg, int wParam, int lParam); 18         #endregion 19  20         private IntPtr _dllLib; 21  22         /// summary 23         /// Initializes a new instance of the see crefLoadDll/ class. 24         /// /summary 25         public LoadDll() 26         { 27              28         } 29  30         /// summary 31         /// Initializes a new instance of the see crefLoadDll/ class. 32         /// /summary 33         /// param namepathThe path./param 34         public LoadDll(string path) 35         { 36             _dllLib  LoadLibrary(path); 37         } 38  39         /// summary 40         /// 注销对象时释放资源 41         /// see crefLoadDll/ is reclaimed by garbage collection. 42         /// /summary 43         ~LoadDll() 44         { 45             FreeLibrary(_dllLib); 46         } 47  48         /// summary 49         /// 初始化dll的路径 50         /// /summary 51         /// param namepathThe path./param 52         public void InitPath(string path) 53         { 54             if (_dllLib  IntPtr.Zero) 55                 _dllLib  LoadLibrary(path); 56         } 57  58         /// summary 59         /// 根据非托管的dll中的方法名称映射成托管的委托类型 60         /// /summary 61         /// param namemethodName非托管的dll中的方法名称/param 62         /// param namemethodType托管的委托类型/param 63         /// returns/returns 64         public Delegate InvokeMethod(string methodName, Type methodType) 65         { 66             //获取非托管的dll中方法的地址 67             var methodPtr  GetProcAddress(_dllLib, methodName); 68             //将非托管的方法转换为委托 69             return Marshal.GetDelegateForFunctionPointer(methodPtr, methodType); 70         } 71     } 调用 1 loadDll  new LoadDll(path); 2             stop  (StopHandler)loadDll.InvokeMethod(stop, typeof(StopHandler)); 3             start  (StartHandler)loadDll.InvokeMethod(start, typeof(StartHandler)); 4             init  (InitHandler)loadDll.InvokeMethod(init, typeof(InitHandler)); 5             query  (QueryHandler)loadDll.InvokeMethod(query, typeof(QueryHandler)); 6             setDatabaseInfo  (SetDatabaseInfoHandler)loadDll.InvokeMethod(setDatabaseInfo, typeof(SetDatabaseInfoHandler)); 7             setMonitorInfo  (SetMonitorInfoHandler)loadDll.InvokeMethod(setMonitorInfo, typeof(SetMonitorInfoHandler)); c中的导出方法 1 /// 插件导出方法 2 extern C __declspec(dllexport) void setDatabaseInfo(LPCTSTR dbServer, LPCTSTR dbUser, LPCTSTR dbPass, LPCTSTR dbName); 3 extern C __declspec(dllexport) void setMonitorInfo(LPCTSTR _agentBm, LPCTSTR _com); 4 extern C __declspec(dllexport) void init(); 5 extern C __declspec(dllexport) void start(); 6 extern C __declspec(dllexport) void stop(); 7 extern C __declspec(dllexport) LPCTSTR query(LPCTSTR devname, LPCTSTR id); C#中的委托 1 ///summary 2         /// 处理Stop事件 3         ////summary 4         publicdelegatevoid StopHandler(); 5         ///summary 6         /// 处理Start事件 7         ////summary 8         publicdelegatevoid StartHandler(); 9         ///summary 10         /// 处理Init事件 11         ////summary 12         publicdelegatevoid InitHandler(); 13         ///summary 14         /// 处理Query事件 15         ////summary 16         publicdelegatestring QueryHandler(string devName, string id); 17         ///summary 18         /// 处理SetDataBaseInfo事件 19         ////summary 20         publicdelegatevoid SetDatabaseInfoHandler(string server,string user,string password,string dbName); 21         ///summary 22         /// 处理SetMonitorInfo事件 23         ////summary 24         publicdelegatevoid SetMonitorInfoHandler(string agentBm, string com); 接下来怎么搞你们都懂的 如果您觉得阅读本文对您有帮助请点一下“推荐”按钮您的“推荐”将是我最大的写作动力如果您想持续关注我的文章请扫描二维码关注马非码的微信公众号我会将我的文章推送给您并和您一起分享我日常阅读过的优质文章。本文版权归作者和博客园共有来源网址http://www.cnblogs.com/marvin/欢迎各位转载但是未经作者本人同意转载文章之后必须在文章页面明显位置给出作者和原文连接否则保留追究法律责
http://www.pierceye.com/news/897311/

相关文章:

  • 设计公司网站需要什么条件网站建设与管理课程代码
  • 局域网网站怎么做软件定制开发的发展前景
  • 门户网站关键词旅游网站开发报价单
  • 哪个网站做视频收益高社区服务呼叫系统 网站的建设
  • 网站是如何制作的工厂 电商网站建设
  • 展览设计网站有哪些南海网站智能推广
  • 贵阳做网站需要多少钱凡科网站建设完成下载下载器
  • 虚拟机上做钓鱼网站照片网站怎么做
  • 建网页和建网站编程猫少儿编程app下载
  • 网站首页介绍cms系统架构
  • 建设厅的工程造价网站东莞网站优化方式
  • 微信网站模板源码wordpress如何编辑
  • 做网站p图工具公司网站建设教程
  • 网站 选项卡 图标苏州网站网页设计
  • 柳州网站建设优化推广wordpress 不显示菜单
  • 网站死循环网站备案和域名备案区别
  • 做网站要学会什么语言装修公司网站模板下载
  • 门户网站建设自查报告网站关键词快速排名技术
  • 如何建网站费用多少全国工商企业查询平台
  • 兰州新区建站什么是网络营销取得成功的基础
  • 南昌 网站 公司wordpress迁移后媒体库丢失
  • 做移动网站点击软件cnzz网站建设
  • 高质量网站外链建设大揭秘做网站之前需要准备什么条件
  • 睢宁做网站百度一下做网站
  • 做国外购物网站国家高职示范校建设网站
  • 网站建设福州公司山西省大同市网站建设公司
  • 浙江网站建设推荐wordpress 增加小工具
  • 个人网站是商业的吗北京网站建设设计
  • 手机网站收费怎么停止网站
  • 网站建设 金疙瘩计划杭州小程序制作公司排行榜