参考网址: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. ARTS第十周

     之前忘了发布 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的 ...

  2. NIO 输入输出

    NIO 是java14 API 提供的一种新输入输出流,一套用于标准IO的文件读写,一套用于网络编程. 1. NIO 与IO 的区别 IO流以字节流输入输出,一次以一个字节进行数据操作,效率慢: NI ...

  3. 麒麟操作系统上安装docker并加载镜像

    最近需要在政务云系统中部署深度学习环境,其使用麒麟操作系统并与互联网相互隔离,无法使用常规的指令行方式进行安装.参考docker官方文档并经过多次尝试,使用离线安装的方式完成了环境的部署.这里做一下笔 ...

  4. Java之注解与反射

    Java之注解与反射 注解(Annotation)简介 注解(Annotation)是从JDK5.0引入的新技术 Annotation作用:注解(Annotation)可以被其他程序如编译器等读取 A ...

  5. java集合(4)-Set集合

    Set集合,类似于一个罐子,程序可以把多个对象"丢进"Set集合,而Set集合通常不能记住每个元素的添加顺序.Set集合与Collection基本相同,没有提供任何额外的方法.实际 ...

  6. 牛客OI测试赛2

    题目链接:https://www.nowcoder.com/acm/contest/185#question A.无序组数 暴力求出A和B的因子,注意二元组是无序的,因此还要考虑有些因子在A和B中都存 ...

  7. Java 获取、删除Word文本框中的表格

    本文介绍如何来获取Word文本框中包含的表格,以及删除表格. 程序测试环境包括: IDEA JDK 1.8.0 Spire.Doc.jar 注:jar导入,可通过创建Maven程序项目,并在pom.x ...

  8. 第八篇 -- 用U盘制作启动盘装Win10系统

    下载装机吧:http://www.zhuangjiba.com 装Win10参考文章:http://www.zhuangjiba.com/bios/13249.html U盘启动盘制作 1.首先将U盘 ...

  9. 【秒懂音视频开发】26_RTMP服务器搭建

    从本节开始,正式开启流媒体相关的内容. 流媒体 基本概念 流媒体(Streaming media),也叫做:流式媒体. 是指将一连串的多媒体数据压缩后,经过互联网分段发送数据,在互联网上即时传输影音以 ...

  10. Drupal Drupalgeddon 2 远程代码执行漏洞(CVE-2018-7600)

    影响版本 Drupal 6.x,7.x,8.x Drupal 是一款用量庞大的CMS,其6/7/8版本的Form API中存在一处远程代码执行漏洞 脚本检测