新手学习C#常见错误_调用第三方动态库dll

大家好,我是朱老师

前几天一个学员在学习c#调用halcon动态库时。一直报错:System.DllNotFoundException:“无法加载 DLL“halcon”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。”,不知道什么原因。 报错代码截图如下:

当时开发背景是这样的:该同学在自己电脑A上开发,可以编译,运行成功。然后将代码部署到了另一台机器B上。安装了vs后,编译没有问题,一点击运行按钮后,就报了上面这个错误了 。折腾了好久,还是没有什么进展。其实新手们对这个问题往往很头疼。不知道是哪个依赖没有添加进来。下面我们就对这个问题进行详细分析,并给出解决方案。

问题分析:

这个代码第27行报错提示很清楚:System.DllNotFoundException:“无法加载 DLL“halcon”: 找不到指定的模块。翻译成中文就是没有找到dll:halcon,顺着这个思路我们去运行正常的A电脑上搜索halcon.dll相关的动态库,结果发现确实存在有这样的一个动态库:halcon.dll。然后再去B电脑上搜索halco.dll,没有找到。然后我们将halcon.dll文件复制到应用程序FindBoltCount.exe相同目录下,程序文件结构如下:


该同学再次运行FindBoltCount.exe程序, 程序启动成功。

点击寻找按钮,寻找螺栓成功!效果如下:

问题结论

这个问题是开发部署过程中经常遇到的问题,解决方法也不止一个:下面我们梳理一下解决方法:

1)简单解决方法:把缺少的模块dll(如halcon.dll、halcondotnet.dll)放到运行目录,可以解决。这种方法适用于现场应急状态,适用于临时解决比较着急的现场问题的临时方案。但是每个工程都要单独添加进去(不推荐)

2)一般解决方法:把halcon.dll等相关库放到system32下面去,应用程序运行时,会自动在该目录下寻找相关依赖,一般情况下也没有必要这样去做。

3)根本解决方法:把Halcon运行目录添加到系统环境变量中(windows系统环境支持都需要在PATH目录),因为这个Halcon运行目录里面还有很多视觉采集相关的dll库需要依赖,特别是很多人写halcon的相机采集的时候,其实整个目录里面的dll都是需要依赖的,也就是halcon运行库Runtime,所以上面那种简单解决方法是不能有效解决其他halcon动态库的使用需求的,你要拷贝好多依赖,把整个halcon运行目录bin都拷贝到system32下面去?没必要。
所以我们最终这样做:Win10打开设置:此计算机->右键属性->系统“高级系统设置”->系统属性->高级->环境变量”。 然后将halcon安装目录的bin文件夹路径添加到path属性,以分号结尾即可

以上就是初学者在学习c#调用halcon等第三方动态库时常见的问题。总结如下:

1:动态库编译错误:添加引用,把第三方动态库添加到vs程序里面。

2:动态库运行错误,将动态库添加到程序运行目录,或者将动态库文件夹添加到windows环境变量配置中

免费领,自动化控制编程入门到开挂学习路径(附教程和软件工具)https://blog.csdn.net/hspx668/article/details/126586129?spm=1001.2014.3001.5502

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Python 调用 C# dll 库最简方法有以下两种: 1.使用Pythonnet库:Pythonnet是一个能够把 Python 和 .NET 程序集融合在一起的库,可以很方便地调用 C# dll 库。首先需要安装Pythonnet库,在Python中导入clr模块,然后使用clr.AddReference添加dll库的引用,最后就可以使用C# dll中的类和函数了。 示例代码: ```python import clr clr.AddReference("test.dll") # 添加dll引用 from test import Test # 导入C#类Test if __name__ == '__main__': t = Test() print(t.HelloWorld()) # 调用C#类Test中的HelloWorld方法 ``` 2.使用ctypes库:ctypes是Python的标准库之一,也可以用来调用C# dll库。可以使用LoadLibrary函数加载dll库,然后使用dll中的函数和类。 示例代码: ```python import ctypes # 加载dll库 test_dll = ctypes.WinDLL("test.dll") # 定义C#类Test中的HelloWorld函数 test_dll.Test_HelloWorld.restype = ctypes.c_char_p test_dll.Test_HelloWorld.argtypes = [] if __name__ == '__main__': print(test_dll.Test_HelloWorld().decode()) # 调用C# dll中的函数Test_HelloWorld ``` 需要注意的是,使用ctypes库调用C# dll库需要在C#中使用__declspec(dllexport)标记暴露函数和类,例如: ```csharp using System; using System.Runtime.InteropServices; namespace Test { public class Test { [DllImport("test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr Test_HelloWorld(); public string HelloWorld() { return Marshal.PtrToStringUni(Test_HelloWorld()); } } } ``` 以上就是Python 调用 C# dll 库最简方法的详细介绍。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华山自控编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值