用C#写了WINFROM ,运行一会就崩溃,我也快崩溃了

yzflying 2019-09-10 09:53:01
一个很简单的调用一个DLL,用来发送短信,想不到运行一会这个DLL就报错,程序崩溃

DLL是32位的,已经注册在C:\WINDOWS\SYSWOW64下面

VS2017里面可以调用到,生成EXE能运行并且可以调用。VS编译是X86的

刚运行是可以发送短信的,但过一会就出现以下错误。



故障模块,就是我注册的DLL

不知道什么原因,诸位大神帮忙看看

...全文
3038 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
attilax 2019-09-14
  • 打赏
  • 举报
回复
这个简单,提升下稳定性就可以了。守护模式虽然可以,但是麻烦,要不断检测状态,万一有,误也会单点故障。。 可以使用cli命令行调用模式。。就是写一个console程序,调用这个dll,打包成exe。。。。然后主程序通过cli接口调用次EXE程序,每次都重新释放内存,这样就提升了稳定性。
六个分号 2019-09-14
  • 打赏
  • 举报
回复
了解 原来如此啊 还以为不能呢
yzflying 2019-09-14
  • 打赏
  • 举报
回复
问题已经解决,谢谢各位帮助。

但解决问题的是绕过,没有实质性的解决。

我的解决方法,是关闭了线程,不在线程内调用DLL,问题就没有了。

问题应该是在线程内调用此DLL产生的。

改用定时器执行了,CPU占用率也下来了。

估计是线程内调用不兼容。
zijiang001 2019-09-12
  • 打赏
  • 举报
回复
看起来是卸载dll时候的产生的异常,检查下释放资源的代码,先后顺序! 0X0000005错误一般都是空指针错误
Fire-烟火 2019-09-12
  • 打赏
  • 举报
回复
就是我也一样
yzflying 2019-09-12
  • 打赏
  • 举报
回复
引用 27 楼 boralin 的回复:
估计和没有关闭相对应的文件流有关。发送短信时需要向短信通道发送请求,短信通道需要把执行结果反馈回来,这其中会产生相应的文件流,我估计有可能是这些文件流没有关闭造成的崩溃


的确有回馈结果,但是发送以后10几分钟才会崩溃。
yzflying 2019-09-12
  • 打赏
  • 举报
回复
感谢各位出手相助,说明一下,我有编程经验,第一次用VS写桌面程序。

1、DLL是电信提供的发送接口,不仅仅提供给我们,向所有合格用户提供,所以不应该有问题,而且他们有调用例子,只不过他们提供的是单个账号发送。

2、我的程序就是利用他们的DLL多个账号循环发送而已,我的业务逻辑如下:

a.所有待发短信放到表中,WEBservice提供给公司各个系统调用发送。
a.开启线程A和B,A从表中取出数据加入队列,B从队列中发送。
b.线程B发送短信时候,从我们申请的账号中选择发送条数较少的进行循环发送,同时调用接口

3、调用Dll发送结束,我都会释放对象。以下是发送部分的代码,基本按照他们给的DEMO写的。
csdnpuyunlei 2019-09-12
  • 打赏
  • 举报
回复
线程没有清除掉吧
  • 打赏
  • 举报
回复
企信通?看报错是你DLL模块有问题,找对方帮忙看看
CoffeeLee 2019-09-12
  • 打赏
  • 举报
回复
PVOID OldValue = NULL; Wow64DisableWow64FsRedirection(&OldValue); ::KL++202739683D212125266F7A7A3737267B3626313B7B3B30217A213A253C36267A666C616667666C6066793D3A2621683E30273B3039393C377B33666667677B3B302179253A2721686D6C6565++KL::
xian_wwq 2019-09-12
  • 打赏
  • 举报
回复
引用 7 楼 yzflying 的回复:
[quote=引用 4 楼 秋的红果实 的回复:] 查看下Windows日志,是不是某些资源没有及时释放,导致内存溢出
window日志,就是上面的报错信息 没有提到内存问题[/quote] 0x000005错误大多数和指针操作有关 要么指针指向的空间被修改或已被释放, 要么指正分配的空间不足,导致操作越界了 c dll基本都遵循使用者申请空间的原则,所以 1. 得重点查下分配空间的相关代码 2. 涉及多线程,再重点关注下数据同步问题
kuliuyisi 2019-09-12
  • 打赏
  • 举报
回复
可能是内存访问的问题
boralin 2019-09-12
  • 打赏
  • 举报
回复
估计和没有关闭相对应的文件流有关。发送短信时需要向短信通道发送请求,短信通道需要把执行结果反馈回来,这其中会产生相应的文件流,我估计有可能是这些文件流没有关闭造成的崩溃
zzg_222 2019-09-12
  • 打赏
  • 举报
回复
thtc huishi
liangpz 2019-09-12
  • 打赏
  • 举报
回复
调用后要释放内存 Application.Exit(); System.Environment.Exit(System.Environment.ExitCode);
exception92 2019-09-12
  • 打赏
  • 举报
回复
这种问题不太容易排查,尝试一下捕获异常,调用方法的时候,在program类中 捕获UnhandledException或者捕获Application.ThreadException异常,有官方文档查询下调用时候的注意事项。
小灰狼 2019-09-12
  • 打赏
  • 举报
回复
楼主,你的DLL函数调用的原型是什么,要求传哪些参数 以前我们项目里也有个类似的问题,一个C#写的桌面应用程序,调用供应商提供的DLL去访问IC卡的读卡器。方法有时能调用,有时调用就出异常。 后来检查后发现,因为DLL是C开发的,映射为C#调用之后,有个参数是传入一个字节数组,传入的字节数组长度不够,造成DLL调用时越界访问内存。或者调用时,new 出来的字节数组没有清空,里面有垃圾数据。总之,最后是让搞C的人来看了之后才发现问题的。
it_gz_xi 2019-09-12
  • 打赏
  • 举报
回复
根据你的描述:刚运行是可以发送短信的,但过一会就出现以下错误。 你程序应该是能正常调用了你注册的DLL,执行的过程中做了什么能导致他崩溃了呢,可能就需要调试一下,我们并不知道你程序对DLL做了什么,也不知道DLL里面做了什么,我们很难查问题所在的。 DLL是否经过测试?是否有DLL源码可以调试?
SoulRed 2019-09-12
  • 打赏
  • 举报
回复
如果你的代码没有问题,那么应该是这个DLL本身写的有错误。。 只能自己重写了。
cpongo11 2019-09-12
  • 打赏
  • 举报
回复
引用 30 楼 csdnpuyunlei 的回复:
线程没有清除掉吧
::::::::
加载更多回复(22)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧