参考网址: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. Spring Boot(一):如何使用Spring Boot搭建一个Web应用

    Spring Boot Spring Boot 是Spring团队旗下的一款Web 应用框架 其优势可以更快速的搭建一个Web应用 从根本上上来讲 Spring Boot并不是什么新的框架技术 而是在 ...

  3. 不用SCRAPY也可以应用selector

    在PY文件中: from scrapy.selector import Selectorfrom scrapy.http import HtmlResponse url="https://m ...

  4. PYTHON3.4.4 升级pip

    python -m pip install --upgrade pipupgrade 前面是两个 "-" 

  5. 成功解决1406, “Data too long for column ‘txt‘ at row 1“

    这是因为数据库里该字段的数据类型所给的数据空间太小.MySQL将截断超过指定列宽度的任何插入值.为了让这个不报错,可以尝试切换MySQL模式不使用严格模式. SET @@global.sql_mode ...

  6. 基于SSM酒店管理系统mysql版本(前后台)

    介绍:spring,springmvc,mybatis,mysql,eclipse 截图: 数据库表:CREATE TABLE `account` ( `id` int(11) NOT NULL AU ...

  7. web系统国际化思路

    需求:php开发多个中文系统支持国际化 思路: 提炼各个系统中的中文字符,替换为资源key. 多媒体文件中的中文定位(图片中的中文,中文录音,中文视频,中文模板等). 统一翻译文字.准备资源文件. 各 ...

  8. Spring总结之事务

    Spring事务 1)定义 事务是指多个操作单元组成的集合,多个操作单元是整体不可分割的,要么都成功,要么都不成功.必须遵守四个原则(ACID) ●原子性(Atomicity):即事务是不可分割的最小 ...

  9. Oracle执行计划总结

    一.ORACLE中常见执行计划 表访问的执行计划 1.table access full:全表扫描.它会访问表中的每一条记录. 2.table access by user rowid:输入源rowi ...

  10. 数组去重汇总—v客学院技术分享

    上周基础班结束了数组的学习内容,这几天有时间整理了下几种比较常用的数组去重的方法供大家查阅!!!!! 话不多说,直接贴代码吧~~~~~~~ 欢迎大家指正,共同学习,一同进步!!! (php开发,web ...