IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 使用C++创建DLL实现简单的功能,并在C#环境下调用该DLL -> 正文阅读

[开发工具]使用C++创建DLL实现简单的功能,并在C#环境下调用该DLL

计算输入数据的阶乘,判断输入的合法性
计算2个输入数据a和b的差(a-b),若a<b则需先交换a,b的值再计算

一:创建C#窗体程序:用于调用C++编写的DLL

(1)启动VS》新建项目》选择c# windows窗体应用(.net Framework)

?(2)项目创建后,整体效果如下图:

二:用C++创建DLL

(1)在解决方案上右击选择【添加】>【新建项目】

?

?(2)在添加新项目对话框中,按下图进行选择填写

?(3)项目创建后,整体效果如下图:

(4)新建头文件(这里是为了独立开,也可以在已有的头文件上写)

?

?(5)在头文件中写入以下代码

#pragma once

extern "C" _declspec(dllexport) int _stdcall test01(int a);
extern "C" _declspec(dllexport) int _stdcall test02(int a, int b);

?(6)在源文件中新建一个cpp项目

?(7)添加刚刚写的头文件“test.h”和“pch.h"

并且写下如是测试代码

#include"test.h"
#include"pch.h"
int _stdcall test01(int a)
{
	if (a < 0)  return -1;
	else if (a > 31)return 0;
	else if (a == 0)return 1;
	else return(a * test01(a - 1));
}
int _stdcall test02(int a, int b)
{
	if (a >= b)return (a - b);
	else return (b - a);
}

?(8)添加定义文件,在源文件夹新建test.def

?

(9)写下如是代码

LIBRARY"Dlltest"
EXPORTS
test01 @1
test02 @2

(10)

先将解决方案切换到Release模式,再在CreateDLL项目名称上右击选择【生成】或【重新生成】

注:Release模式下生成的DLL才是最终的,Debug模式下生成的DLL有时会出问题

(11) 在解决方案所在的目录中打开Release文件夹即可看到生成的DLL

?

三:用C#项目调用C++创建DLL

(1)将C#项目设置为启动项目,并且将解决方案设置为Debug模式

?

(2)C#项目中定义DllImport

class DllTest
        {
            [DllImport(@"../../Release/Dlltest.dll", EntryPoint = "test01", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            public static extern int test01(int a);

            [DllImport(@"../../Release/Dlltest.dll", EntryPoint = "test02", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            public static extern int test02(int a, int b);
        }

?(3)这样就可以在后面的程序中调用

?

四,c#代码全部

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace 新调用dll
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        class DllTest
        {
            [DllImport(@"../../Release/Dlltest.dll", EntryPoint = "test01", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            public static extern int test01(int a);

            [DllImport(@"../../Release/Dlltest.dll", EntryPoint = "test02", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            public static extern int test02(int a, int b);
        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox2.Text == "")
            {
                MessageBox.Show("请输入求阶乘的数字!");
            }
            else
            {
                int r1 = DllTest.test01(int.Parse(textBox2.Text));
                textBox1.Text = r1.ToString();
            }
        }

        private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 0x20) e.KeyChar = (char)0;  //禁止空格键
            if ((e.KeyChar == 0x2D) && (((TextBox)sender).Text.Length == 0)) return;   //处理负数
            if (e.KeyChar > 0x20)
            {
                try
                {
                    double.Parse(((TextBox)sender).Text + e.KeyChar.ToString());
                }
                catch
                {
                    e.KeyChar = (char)0;   //处理非法字符
                }
            }
        }

        private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 0x20) e.KeyChar = (char)0;  //禁止空格键
            if ((e.KeyChar == 0x2D) && (((TextBox)sender).Text.Length == 0)) return;   //处理负数
            if (e.KeyChar > 0x20)
            {
                try
                {
                    double.Parse(((TextBox)sender).Text + e.KeyChar.ToString());
                }
                catch
                {
                    e.KeyChar = (char)0;   //处理非法字符
                }
            }
        }

        private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 0x20) e.KeyChar = (char)0;  //禁止空格键
            if ((e.KeyChar == 0x2D) && (((TextBox)sender).Text.Length == 0)) return;   //处理负数
            if (e.KeyChar > 0x20)
            {
                try
                {
                    double.Parse(((TextBox)sender).Text + e.KeyChar.ToString());
                }
                catch
                {
                    e.KeyChar = (char)0;   //处理非法字符
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if(textBox3.Text==""&&textBox5.Text=="")
            {
                MessageBox.Show("请输入求差的数据!");
            }
            else
            {
                textBox4.Text = DllTest.test02(int.Parse(textBox3.Text), int.Parse(textBox5.Text)).ToString();
            }
        }
    }
}

?

?

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:26:16  更:2021-10-06 12:27:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:35:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码