C#调用DLL的问题,程序直接退出,返回值为2

lei_h11 2018-03-02 07:05:13
用C语言打包成DLL动态链接库供C#调用,C源程序中的矩阵乘法和求逆使用了MKL库函数,在C#中调用乘法和包含乘法的函数时,出现下面的错误:
““test1.vshost.exe”(CLR v4.0.30319: test1.vshost.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
程序“[7856] test1.vshost.exe”已退出,返回值为 2 (0x2)。”

接着在工具->选项->调试中取消勾选“启用仅我的代码”,得到下面的错误提示:

““test1.vshost.exe”(CLR v4.0.30319: test1.vshost.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”。已加载符号。
程序“[20376] test1.vshost.exe”已退出,返回值为 2 (0x2)。”

当不使用这些库函数而使用自己写的乘法和求逆的源程序时,则不会出现问题。

劳烦各位有遇到类似问题的各位给一点提示之类的,谢谢
...全文
1791 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2018-03-09
  • 打赏
  • 举报
回复
引用 23 楼 lei_h11 的回复:
最后发现是因为一些有关MKL的dll添加不全导致的,因为我也不清楚用到了哪个dll,当把有关MKL的全部dll都添加到执行路径下之后,发现问题解决了。还好最后算是解决了, 多谢@xian_wwq 不遗余力地解惑和@秋的红果实 @Saleayas @幻夢之葉 @SoulRed 的提示
使用dependency工具查看C dll的依赖dll,按需添加!或者本地事件查看器查看不能启动时候缺少什么依赖的dll也是可以的
lionelmessiCODE 2018-03-08
  • 打赏
  • 举报
回复
感觉封装有点问题,我也在头疼C#调用C++的dll问题
lionelmessiCODE 2018-03-08
  • 打赏
  • 举报
回复
没太看懂,但是你要是用C#调用C++或C的dll,怎么也需要在C#进行封装后才能在C#中使用吧
lei_h11 2018-03-08
  • 打赏
  • 举报
回复
引用 21 楼 zhanghan1993 的回复:
没太看懂,但是你要是用C#调用C++或C的dll,怎么也需要在C#进行封装后才能在C#中使用吧
不用再C#中封装,直接在C/C++中封装后生成dll,然后再在C#中调用就行了,网上有很多C/C++封装的博客之类的…
lei_h11 2018-03-08
  • 打赏
  • 举报
回复
最后发现是因为一些有关MKL的dll添加不全导致的,因为我也不清楚用到了哪个dll,当把有关MKL的全部dll都添加到执行路径下之后,发现问题解决了。还好最后算是解决了, 多谢@xian_wwq 不遗余力地解惑和@秋的红果实 @Saleayas @幻夢之葉 @SoulRed 的提示
xian_wwq 2018-03-06
  • 打赏
  • 举报
回复
引用 15 楼 lei_h11 的回复:
[quote=引用 14 楼 xian_wwq 的回复:] 为了定位问题, 建议直接使用C调用cblas_sgemm(),验证算法正确性 对MKL不熟悉,不知道有没有什么依赖
是的,算法是没什么问题的,因为打包的源程序就是C写的,并且在C语言中调用打包好的DLL,测试过是没什么问题的[/quote] 因为托管、非托管的代码都有,所以按道理联调就能找到问题 如果c的dll是release模式下编译的,测试c代码release模式运行能通过; 如果c的调用环境和c#的相同; 如果c的输入参数和C#的输入参数核对后保证相同, 个人感觉道理上说不通, 实在不行, 找台干净机器(只安装vc-redist,不要有vs这类开发环境)再确认下
SoulRed 2018-03-06
  • 打赏
  • 举报
回复
如果是c++编译情况下,需要 extern "C"
lei_h11 2018-03-06
  • 打赏
  • 举报
回复
引用 16 楼 Saleayas 的回复:
我的 13# 回复有什么问题吗?为什么被删除了。
没啥问题啊,现在还在啊,出bug了吧…
Saleayas 2018-03-06
  • 打赏
  • 举报
回复
我的 13# 回复有什么问题吗?为什么被删除了。
lei_h11 2018-03-06
  • 打赏
  • 举报
回复
引用 14 楼 xian_wwq 的回复:
为了定位问题, 建议直接使用C调用cblas_sgemm(),验证算法正确性 对MKL不熟悉,不知道有没有什么依赖
是的,算法是没什么问题的,因为打包的源程序就是C写的,并且在C语言中调用打包好的DLL,测试过是没什么问题的
xian_wwq 2018-03-06
  • 打赏
  • 举报
回复
为了定位问题, 建议直接使用C调用cblas_sgemm(),验证算法正确性 对MKL不熟悉,不知道有没有什么依赖
lei_h11 2018-03-06
  • 打赏
  • 举报
回复
引用 19 楼 xian_wwq 的回复:
[quote=引用 15 楼 lei_h11 的回复:] [quote=引用 14 楼 xian_wwq 的回复:] 为了定位问题, 建议直接使用C调用cblas_sgemm(),验证算法正确性 对MKL不熟悉,不知道有没有什么依赖
是的,算法是没什么问题的,因为打包的源程序就是C写的,并且在C语言中调用打包好的DLL,测试过是没什么问题的[/quote] 因为托管、非托管的代码都有,所以按道理联调就能找到问题 如果c的dll是release模式下编译的,测试c代码release模式运行能通过; 如果c的调用环境和c#的相同; 如果c的输入参数和C#的输入参数核对后保证相同, 个人感觉道理上说不通, 实在不行, 找台干净机器(只安装vc-redist,不要有vs这类开发环境)再确认下 [/quote] 关键是MKL函数库的源代码并不清楚,只有一个接口,所以不清楚问题到底出在什么地方了。 在release环境下生成的dll,在测试的C代码中也可以通过运行; C测试的时候需要导入下附加包含目录和附加库目录之类的,但是C#中好像没有这选项吧?,把相关的dll和lib文件拷到 执行目录下就可以了吧 输入参数的话,就我上面的乘法和调用的程序,参数应该是没问题的
Saleayas 2018-03-05
  • 打赏
  • 举报
回复
比较一下 C 和 C# 的测试代码。
幻夢之葉 2018-03-05
  • 打赏
  • 举报
回复
仅本机调试,进入C代码,单步调试看看是哪里出问题
xian_wwq 2018-03-05
  • 打赏
  • 举报
回复
更正下,如果是c++编译情况下,需要 extern "C",如果是c的,那么不需要
lei_h11 2018-03-05
  • 打赏
  • 举报
回复
调试过了,确实是在dll中封装的mkl函数库出现的问题,所以C#调用dll时,被调用的dll中不能有依赖于其它dll的函数吗,如果可以的话,该怎么处理?我现在的问题就是在要执行上面那个cblas_sgemm函数时,程序直接退出了。 可能说的不太明白,我在叙述下现在的先提条件: 被调用的DLL的源代码是C写的; cblas_sgemm()是intel的一个数学函数库MKL中的一个矩阵乘法函数; DLL是在C#中调用的; 在C语言中写了个简单的测试代码调用DLL,发现可以完成计算并得到正确的结果; 所以现在我能想到只有是不是C#的原因? 如果各位有遇到类似的问题的话,麻烦给点建议,谢谢
xian_wwq 2018-03-05
  • 打赏
  • 举报
回复
1.c/c#封装的功能DLL,需要声明为 extern "C" 2. 在解决方案中加入c的工程代码, 对c#工程进行设置:右键工程-属性-调试-启用非托管代码调试, 可以对c#-C直接进行联调 可以很直观的看到 是传入参数转换问题,还是内部代码的问题
lei_h11 2018-03-04
  • 打赏
  • 举报
回复
引用 6 楼 Saleayas 的回复:
那些都是调试信息,和程序正确与否没有关系。 比较一下,C 调用代码 和 C# 调用代码。
如果单说乘法这个函数的话,下面是在C中的函数, RXDLL_API void __stdcall matrix_multi(float *pxp, float *p1, float *p2, int m, int n, int l) { double alpha = 1.0; double beta = 0.0; cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m, l, n, alpha, p1, n, p2, l, beta, pxp, l); } 在C#中导出乘法这个函数时像下面这样, [DllImport("RXDll.dll", EntryPoint = "matrix_multi", CharSet = CharSet.Auto)] public unsafe static extern void matrix_multi(float[] pxp, float[] p1, float[] p2, int m, int n, int l); 出现的问题和上面的是一样的,所以才感觉问题是出在调用类库这个地方了
lei_h11 2018-03-04
  • 打赏
  • 举报
回复
引用 5 楼 From_TaiWan 的回复:
记得好像调用了类库的C程序dll,C#不可以调用
是说如果dll中封装了现成的类库,C#不能调用吗,把包含类库的dll放到执行目录下也不行吗 谢谢回复
Saleayas 2018-03-04
  • 打赏
  • 举报
回复
那些都是调试信息,和程序正确与否没有关系。 比较一下,C 调用代码 和 C# 调用代码。
加载更多回复(4)
微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”包含: 1.微信小程序系统教程[阶段]_客服消息 2.微信小程序系统教程[阶段]_微信支付 3.微信小程序系统教程[阶段]_九宝电商系统 学习“微信小程序系统教程[阶段]”要求有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[阶段]”。 阶段讲解的客服消息,是针对小程序的。后台程序用接近底层的技术,没有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要求同学们认真听讲,有不会的技术问题可以请教老师。购买课程后请联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课请咨询qq2326321088

110,567

社区成员

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

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

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