C# 加载C++创建的动态链接库dll

摘要:
创建dll1。打开vs,单击文件--˃新建--˃项目。如果dll使用x64,则还需要将C#选择为x64。

创建dll

1.打开vs,点击文件-->新建-->项目。

2.选择C++下面的windows桌面,右边选择动态链接库(DLL)。新建成功之后,默认为x86平台。

按照你自己的需求更换平台,必须调用的和被调用的dll同为一个平台。

C# 加载C++创建的动态链接库dll第1张

3.新建之后,在头文件中添加mydll.h,内容为:

#define DLL_API extern "C" _declspec(dllexport)

4.mydll.cpp为以下内容(需要调用的函数)以两个int相加为例。

  1.  
    DLL_API int add(int x, int y)
  2.  
    {
  3.  
    return x + y;
  4.  
    }

5.点击生成--->生成解决方案。

C# 加载C++创建的动态链接库dll第2张

6.如果创建完成没有更换调试平台(x86)的话,生成的dll文件会保存在Debug文件夹下。如果选择为x64平台下面的话,dll文件会放在x64文件夹下的Debug文件夹下。

C# 加载C++创建的动态链接库dll第3张

7.到这里动态链接库dll就创建完成了。

转自:链接

C#调用动态链接库的方法:

C#调用动态链接库方法

  1.  
    [DllImport("mydll.dll")]
  2.  
    public static extern int Add(int a,int b);
  3.  
     
  4.  
    private void btn_add_Click(object sender, EventArgs e)
  5.  
    {
  6.  
    int sum=Add(5,6);
  7.  
    MessageBox.Show(sum.Tostring());
  8.  
    }

如果需要调用同一个dll文件中的两个不同函数,则需要再次引动dll

  1.  
    [DllImport("mydll.dll")]
  2.  
    public static extern void change();
  3.  
    [DllImport("mydll.dll")]
  4.  
    public static extern void line(out double left,out double right);

出现问题列表:

1.找不到函数入口点

解决方法:大部分原因是在创建dll文件时,dll文件的函数没有添加 extern "C"   或 __declspec(dllexport)。

2.正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

解决方法:

1、把VS菜单的 调试->异常->Managed Debuggin Assistants->LoaderLock 的选中状态去掉。
2、如果异常(exception)这一项没有的话,在工具---自定义---命令选项卡---左边选择调试--右边把异常托到菜单里。
3、快捷键Ctrl+Alt+E,修改Managed Debuggin Assistants->LoaderLock 的选中状态去掉。

3.试图加载格式不正确。

解决方法:

出现这个报错,主要原因是dll与C#不在同一平台导致。如果dll使用x64,而C#也需要选为x64。

C# 加载C++创建的动态链接库dll第4张

免责声明:文章转载自《C# 加载C++创建的动态链接库dll》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Openssl ec命令faiss索引基于数量级和内存限制的选择下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

将Qt5.5 动态链接生成的exe及依赖dll打包方法

Qt静态编译链接生成的exe文件,不需依赖七大姑八大姨的一堆dll,可以独立运行,发布很方便。但绝大多数用的都是Qt开源版本,如果用静态链接,会有些限制。那有没有办法即能享受静态编译的方便,又不受开源许可的限制呢?方法之一,就是用动态编译,然后把exe和需要的dll整合成一个文件,问题就解决了。 使用工具: Enigmavb(单文件封装工具) 下载:htt...

md /mdd /ml /mt/mtd

VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd)C 运行时库                        库文件Single thread(static link) ML            libc.libDebug single thread(static link) MLd      ...

C#下的BMP图像压缩类

这几天研究比较多,其中一个成果就是下面这个图像压缩类。可以把BMP文件压成任意质量的JPEG,在.net framework 2.0下编译通过。有时间的话我会把它写成可以压缩其他格式的类,其实改一下参数就可以了。 时间原因没有写注释,(不过这个类真够简单了)还是介绍一下吧: 只有一个没有重载的构造函数,参数是待压缩BMP文件的路径,还有一个长整形的质量参数...

Debug与Release的区别

  Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。Release  Buil...

C#开发Android应用实战 读后感

最近两年从事C#网站和项目开发比较多,JAVA项目比较少了,没有经历过手机开发项目的经验。手上也有两部Android、HTC智能手机,喜欢手机客户端上部分软件的功能,自己也想开发一个类似小说阅读器手机端的搜集IT技术文章的手机软件。特申请一本《C#开发Android应用实战》来学习和阅读。年前一月三十一号拿到此书,因为手头还有WCF等技术一直在学习和实践,...

C#.Net C/S快速开发框架V2.2版本介绍

C#.Net C/S快速开发框架V2.2版本介绍 C/S结构快速开发框架V2.2 解决方案:CSFramework.* 命名的模块为框架共公模块(核心模块)框架版本:V2.2CSFramework3.* 是客户端及服务端的业务模块.高级版(WebService架构)已升级到3.0,此解决方案模块名是以高级版命名的。注:标准版和高级版框架核心是一样的,...