opencv的c++程序封装成dll用c#调用,遇见的问题

先看文章最后一句话

1.问题一:无法加载DLL,找不到指定的模块

解决办法:把你用的dll放在你自己程序的启动路径下。比如bin/debug/....或者x64/debug/.....

如果不知道应该放哪里,就都试试哪个文件夹都试试,再一个一个删除,看看哪个会影响程序运行,就是这个文件夹了

 

问题二:试图加载格式不正确的程序

解决办法:因为平台设置不正确,看看你的平台是什么,跟编译dll的平台一样吗?

核对:(C#配置和C++)代码配置

 如果发现自己编译的opencv的c++代码是x64的而c#程序不能用x64,那就只能重新编译一个win32的x86或者win32的win32程序。注意编译dll前需要配置win32也就是x86版本的opencv,具体配置方法和x64的配置方法一样,只是要选择x86的文件夹下的bin进行配置,然后再编译dll(参考配置x64配置自己的x86)。请注意:有的opencv自带x86版本,如opencv2.4.13,有的只有x64版本,需要自己用Cmake编译,还要注意配置时候自己VS选择的版本。然后将引用dll的c#程序加一句话,如下:

[DllImport("PackageDll.dll", EntryPoint = "CutPic", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CutPic(string path);

C#默认调用的是__Stdcall

 

问题三:外部组件发生异常

解决办法:单步调式,看是不是参数传错了,看是不是找不到要处理的文件,看是不是C++和C#的传参值有问题(如C#用string类型,C++的形参要用char *)

问题四:.NETFramework,Version不匹配问题

解决办法:在启动程序的app.config文件中加入运行时动态变化.NETFramework,Version版本,如:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  <supportedRuntime version="v2.0.50727"/>
</startup>

x86版本示例:https://download.csdn.net/download/qq_40155090/12004885 

 

切记:代码执行的时候,要重新生成解决方案,每次改东西都重新生成,即使改传入的参数,也要重新生成解决方案,很重要、很重要、很重要 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章