c++生成DLL文件,给c#项目调用
c++生成DLL文件
用c#编写的界面做图像处理不是很方便,因为c#没有官方提供的opencv库,只有opencvsharp——一个日本工程师编写的OpenCV库。所以在c++中编写好图像处理程序,生成DLL文件,再给c#项目调用是个便捷的好办法。
新建c++项目
新建Visual c++的Win32项目——>下一步——>勾选DLL,空项目
配置包含目录,库目录,附加依赖项
注意,要配置Release,x64环境,因为DLL要在Release环境下生成
配置附加依赖项时,末尾带d的对应Debug环境,不带d的对应Release环境,如图
新建.cpp文件和.def文件
1.新建“xkk_dll.cpp”文件,里面是想封装的程序,下面是一个简单的示例,用opencv显示一张图:
2.新建“source.def”文件,其中LIBRARY语句说明该def文件是属于相应DLL的,在这里是工程名:xkk_dll,如果不同则应用程序连接库时会发生连接错误!EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加 @n,如函数Test_dll@1,Sub@2
生成解决方案,生成成功后记录生成的dll所在的位置
c#调用生成的DLL文件
调用时c#的运行平台应该与c++生成dll时的平台对应,生成dll时是Release,x64;则c#应该为Debug,x64。
c#开头应该添加引用:
using System.Runtime.InteropServices;
在调用dll的位置之前应添加申明:
[DllImport("E:\\project\\xkk_dll\\x64\\Release\\xkk_dll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public extern static int Test_dll();
之后便是调用:
private void button1_Click(object sender, EventArgs e)
{
Test_dll();
}
采坑
当调用时报错
无法加载 DLL“E:\project\xkk_dll\x64\Release\xkk_dll.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
网上的解决方法都无效,甚至重装了vs。最后发现是自己c++里配的那个版本的opencv出问题了,所以生成的调用了opencv的dll自然会出问题,重新配了一版opencv,解决了,md。