1、前奏
最近帮老师用opencv做一个东西,在VS2013中配置了opencv 的经典版本opencv2.4.9,做了一个视频解帧的工作,封装成了C++的dll,以供对方公司使用C#语言调用,所以我需要用C#测试我的dll
C#语言真是难缠,dll缺失或者dll中内部有错误都只给你一个信息那就是:“无法加载DLL"***.dll":找不到指定的模块(异常来自HRESULT:0x8007007E)”,真是令人头大
2、解决办法
我是尝试遍了所有的这个错误的解决办法,依然不能挽救错误,还是报同样的错误。
C#中调用C++的dll也有两种方式,一种是静态调用,一种是动态调用,我先使用的静态调用,网上的静态调用方式下出这个错误的方法已试完看到网上最好的那个帖子:
帖子如下地址如下:http://blog.csdn.net/peng825223208/article/details/38069779
这篇帖子我以为很吊,相信读我博客的你应该也会看到。由于不懂C#,就把它的代码敲进去进行尝试调用,什么改@“xxxx.dll”这样的绝对路径一点用都没有,还是找不到dll,它里面说的托管和非托管我百度了一下也没看明白,都是官方解释,到底什么样的dll是托管的什么样的dll是不托管的,对于一个C#初次接触的人来说不是很明白,代码敲进去也有错,所以就不用它的方法了,写的又不清楚。
接下来我贴一下我的dll的代码和我用C#调用这个dll的代码,供大家参考自己的改,然后我会给出可能出错的原因,90%错误都在其中。
2、利用C++写的dll代码(配置了opencv库):
/*
该函数主要功能为将输入的视频分解成帧,有三个输入参数
char*inputPath:输入视频
char*ouputPath:输出帧目录
int maxFrame:想要分解出的帧数,从第一帧算起
返回值为int类型,表示最终分解出的帧的个数,如果maxFrame大于视频实际帧数,返回实际帧数,如果小于则返回maxFrame帧
date:2017/10/26
author:tonglewang
address:ECNU
*/
#include "stdafx.h"
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
extern "C" __declspec(dllexport)int videoTransferToImage(char*inputPath, char*ouputPath,int maxFrame){
cout <<&