参考网址:https://blog.csdn.net/weixin_34976988/article/details/99625533

一、创建DLL
1、建立动态链接库项目

2、创建头文件和源文件

删除 framework.h、dllmain.c 等现有文件(照顾VS2013等低版本),创建新的头文件 Mydll.c Mydll.h

Mydll.h头文件代码如下:

#include<stdio.h>

_declspec(dllexport) void test_print(char const* str);
_declspec(dllexport) int test_sum(int a, int b);

Mydll.c 代码如下:

#include<stdio.h>
#include"Mydll.h"
void test_print(char const* str)
{
printf("测试输出的内容是:%s\n", str);
}

int test_sum(int a, int b)
{
return a + b;
}

3、配置C环境

右键项目 --> 属性 --> C/C++ --> 预编译头 -->预编译头 改为创建;如果第二步删除了pch.h,在预编译头文件里也要删除pch.h

右键项目 --> 属性 --> C/C++ --> 高级 -->编译为 改成 编译为 C 代码 (/TC)

应用后保存即可

4、生成dll

右键生成即可得到dll文件

二、C语言动态调用dll
C语言和C#都可以通过多种方法调用dll,动态调用是在运行时完成的,也就是程序需要用的时候才会调用,动态调用不会在可执行文件中写入DLL相关的信息。

动态调用主要用到LoadLibrary,GetProcAddress和FreeLibrary三个函数

一、创建C控制台运用,代码如下:

#include <stdlib.h>
#include <windows.h>
#include<stdio.h>

int main(int argc, char const* argv[])
{
void(* test_print)(char const*) = NULL;
int(* test_sum)(int, int) = NULL;

HMODULE module = LoadLibraryA("CreatDll.dll");
if (module == NULL)
{
system("error load");
}

test_print = (void(*)(char const*))GetProcAddress(module, "test_print");
test_sum= (int(*)(int, int))GetProcAddress(module, "test_sum");

if ( test_print != NULL)
{
test_print("输出测试");
}
else {
system("function p_test_print can not excute");
}
int sum_result;
if ( test_sum != NULL)
{
sum_result = test_sum(234, 432);
printf("求和结果是:%d\n", sum_result);
}
else {
system("function p_test_print can not excute");
}
FreeLibrary(module);
system("pause");
return 0;
}

2、将刚刚生成的DLL文件拷贝到控制台项目根目录即可。

3、运行结果

三、C#调用dll
C#通过映射同意可以动态调用dll,这里简单介绍静态调用dll。

1、创建C#控制台应用,添加如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace TestDll
{
class Program
{
[DllImport("CreatDll.dll", EntryPoint = "test_sum", CallingConvention = CallingConvention.Cdecl)]
public static extern int test_sum(int a,int b);

static void Main(string[] args)
{
int a = 234, b = 432;
int sum = 0;
Console.WriteLine("{0}+{1}={2}",a,b,test_sum(a,b));
Console.ReadKey();
}
}
}
2、将生成的DLL文件拷贝到C#项目目录的Debug下,即可调用,调用结果如下:

项目源代码点击这里下载
————————————————
版权声明:本文为CSDN博主「smile_2020」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_34976988/article/details/99625533

Visual Studio 2019 使用C语言创建动态链接库(Dll)并使用C语言和C#实现调用的更多相关文章

  1. 2019年第一天——使用Visual Studio 2019 Preview创建第一个ASP.Net Core3.0的App

    一.前言: 全文翻译自:https://www.talkingdotnet.com/creating-first-asp-net-core-3-0-app-visual-studio-2019/ Vi ...

  2. 带你使用Visual Studio 2019创建一个MVC Web应用

    工欲善其事必先利其器,我们既然有Visual Studio2019这样的IDE为什么不用?学.Net Core而不用Visual Studio进行开发可谓是多么另类呀!既然你已经安装了VS2019的话 ...

  3. 创建Visual Studio 2019离线安装包

    可以在不同的网络环境和不同的计算机上在线安装微软Visual Studio 2019.微软提供的在线安装工具(Visual Studio web installer)可以让用户在线下载最新版本Visu ...

  4. Visual Studio 2019 正式发布,重磅更新,支持live share

    如约而至,微软已于今天推出 Visual Studio 2019 正式版,一同发布的还有 Visual Studio 2019 for Mac. Visual Studio 2019 下载地址:htt ...

  5. Visual Studio 2019 RC入门

    介绍 在本文中,让我们看看如何开始使用Visual Studio 2019 RC.Microsoft现已发布Visual Studio Release Candidate,现在可以下载了.最初,Mic ...

  6. [翻译] 使用 Visual Studio 2019 来提高每个开发人员的工作效率

    [翻译] 使用 Visual Studio 2019 来提高每个开发人员的工作效率 原文: Making every developer more productive with Visual Stu ...

  7. Visual Studio 2019 RC

    Visual Studio 2019 RC入门 介绍 在本文中,让我们看看如何开始使用Visual Studio 2019 RC.Microsoft现已发布Visual Studio Release ...

  8. 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  9. 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

随机推荐

  1. gitlab配置邮箱服务

    目录 1. SMTP服务 2. 服务端配置 3. 更新配置 4. 邮件测试 当需要进行 账号注册,创建项目,或合并分支等操作时,可通过邮件通知.邮件验证的方式实现. 1. SMTP服务 用于配置在服务 ...

  2. Sharding+SpringBoot+Mybatis 读写分离

    基于Sharding JDBC的读写分离 1.引入pom.xml <dependencies> <!-- mybatis --> <dependency> < ...

  3. Codeforces Round#704 Div2 题解(A,B,C,D,E)

    FST ROUND !!1 A Three swimmers: 直接整除一下向上取整就好了: #include <bits/stdc++.h> using namespace std; t ...

  4. 北京大公司二面:了解Redis持久化机制吗?

    今日总结 Redis持久化机制:RDB和AOF RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制) AOF持久化:根据配置将写命令存储至日志文件中,顺序写&& ...

  5. 【剑指offer】73.数组中出现次数超过一半的数字

    73.数组中出现次数超过一半的数字 知识点:数组:哈希:占领地思想: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4 ...

  6. Scala学习——函数

    一.函数的定义(def) object FunctionApp { //定义函数:方法体内最后一行为返回值,不需要使用return def add(a:Int,b:Int):Int={ a + b } ...

  7. easyui-textbox使用value设置默认值失效

    1,使用easyu-textbox的value参数设置默认值失效,easyui-textbox放到dialog弹框中,当dialog的closed为false时,也就是打开dialog时,设置的val ...

  8. Jmeter入门 浏览器设置代理服务器和录制脚本

    第一步: 可以设置浏览器代理,本文章推荐使用火狐浏览器 在浏览器-首选项--网络设置里面设置代理服务器 注意:端口号可以自行设置,但是不可以与本机其他代理产生冲突 第二步: 打开jmeter工具,添加 ...

  9. Python -- 值转换为字符串的两种机制

    可以通过以下两个函数来使用这两种机制:一是通过str函数,它会把值转换为合理形式的字符串,以便用户可以理解:而repr会创建一个字符串,它以合法的Python表达式的形式来表示值.下面是一些例子: & ...

  10. 静态Web服务器(py版)

    近来,对http协议进行了研究,闲来无事.自己使用python3写了个静态Web服务器,以下是代码: static_Web_sever.py ''' 思路:首先使用socket创建tcp服务器,照旧绑 ...