线上出故障了!我慌得一匹!
线上运行的Java应用突然没有响应、响应缓慢,进程突然消失,遇到这些情况应该如何应对呢? 今天教大家如何应对在线故障! 原文发布时间为:2018-11-29 本文作者:飒然Hang 本文来自云栖社区合作伙伴“Java后端技术”,了解相关信息可以关注“Java后端技术”。
总结遇到的引用各种问题:(建议使用x86的编译方式)
[DllImport(@"XXX.dll", EntryPoint = "TOEC_ComInit", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern int Com_Init(int flag);
第一个参数:就是引用的DLL名称;
第二个参数【EntryPoint】:指示要调用的 DLL 入口点的名称或序号;就是DLL中要调用的方法名称;
第三个参数【CharSet】:指示如何向方法封送字符串参数,并控制名称重整;就是编码格式;
第四个参数【ExactSpelling】:控制 System.Runtime.InteropServices.DllImportAttribute.CharSet 字段是否使公共语言运行时在非托管,DLL 中搜索入口点名称,而不使用指定的入口点名称。
第五个参数【CallingConvention】:指示入口点的调用约定
(1)Winapi:此成员实际上不是调用约定,而是使用了默认平台调用约定。例如,在 Windows 上默认为 System.Runtime.InteropServices.CallingConvention.StdCall,在Windows CE.NET 上默认为 System.Runtime.InteropServices.CallingConvention.Cdecl。
(2)Cdecl:调用方清理堆栈。这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法。
(3)StdCall:被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。
(4)ThisCall:第一个参数是 this 指针,它存储在寄存器 ECX 中。其他参数被推送到堆栈上。此调用约定用于对从非托管 DLL 导出的类调用方法。
(5)FastCall:不支持此调用约定。
遇到的问题:CallBack::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
解决办法:
回调函数写成全局静态成员函数。
原始错误的写法:
[DllImport(@"COM_DLL.dll", EntryPoint = "TOEC_ComRun", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
public static extern int CPP_Run(CallBack cb);
public delegate void CallBack(tagOutInfo data);
CPP_Run(handle_sx, par, CallBack_Function);
public static void CallBack_Function(tagOutInfo data)
{
//.....
}
正确的写法:
[DllImport(@"COM_DLL.dll", EntryPoint = "TOEC_ComRun", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
public static extern int CPP_Run(CallBack cb);
public delegate void CallBack(tagOutInfo data);
private CallBack cb_f;
CPP_Run(handle_sx, par, cb_f );
public void Init(){
cb_f=CallBack_Function;
}
public void CallBack_Function(tagOutInfo data)
{
//.....回调函数体
}
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。
WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。