首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >VS2017生成DLL(C语言)文件并在C#中使用

VS2017生成DLL(C语言)文件并在C#中使用

作者头像
zls365
发布2021-01-28 20:19:25
发布2021-01-28 20:19:25
2.7K0
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全

下面我们将在VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件)

第一步:新建一个项目

第二步:选择Windows桌面向导(这里先不要去管上面的“动态链接库(DLL)”)

第三步:选择动态链接库,并空项目打勾√

第四步:添加一个.c源文件

第五步:(因为这里以C语言为例子,将后缀改为.c)

第六步:在c文件中输入一个简单的函数这里使用了_declspec(dllexport),但_declspec(dllexport)并不是必须的,后面一种方法将不使用_declspec(dllexport)

代码语言:javascript
复制
_declspec(dllexport) int sum(int a, int b){    return a + b;}

第七步:新建一个头文件

第八步:在头文件中输入函数的声明

这里也可以改成下面这样,extern "C" 如果是c语言调用并不需要,加这个是因为c++调用的话,指定c++调用方式和c语言一样. 加这个就是做兼容性的.

代码语言:javascript
复制
#ifndef SHARE_H
#define SHARE_H
#endif

#ifdef __cplusplus //(内置宏,如果是c++,在编译器预处理的时候加上extern,如果是c语言调用的时候是不处理的)
extern "C"
{
#endif


    _declspec (dllexport) int sum(int a, int b);


#ifdef __cplusplus
}
#endif 

第九步:编译

第十步:Debug文件夹下的两个文件DLL.dll和DLL.lib就是我们要使用的两个文件了

因为使用的_declspec(dllexport),虽然这里我们只编译了一次,却生成了dll和lib两个文件

接下来在C# 中使用:首先将上面生成的dll放到C#的目录下,一般是\bin\x86\Debug,(注意下面将之前的DLL.dll改成了Project2.dll,非必须,保持一致就好)。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp12
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //[DllImport("Project2.dll", CallingConvention = CallingConvention.Cdecl,EntryPoint = "sum")]
        [DllImport("Project2.dll", EntryPoint = "sum")]
        private static  extern  int sum(int a, int b);


        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(sum(10,20).ToString());
        }
    }
}

运行后:

托管调试助手 "PInvokeStackImbalance":“对 PInvoke 函数“WindowsFormsApp12!WindowsFormsApp12.Form1::sum”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。”

修改如下:(参考https://jingyan.baidu.com/article/d169e1860bb38f436611d8c8.html)

代码语言:javascript
复制
 [DllImport("Project2.dll", CallingConvention = CallingConvention.Cdecl,EntryPoint = "sum")]

运行正常:

参考网址:

  1. https://www.cnblogs.com/lanhaicode/p/10798385.html
  2. https://oomake.com/question/1394538
  3. https://jingyan.baidu.com/article/d169e1860bb38f436611d8c8.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档