Visual Studio 2019 使用C语言创建动态链接库(Dll)并使用C语言和C#实现调用

一、创建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下,即可调用,调用结果如下:

 

 

项目源代码点击这里下载

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
动态是一种可重定位的二进制文件,它包含了一些可供其他程序调用的函数或数据。在 Windows 平台上,动态采用 .dll 后缀名,而在 Linux 平台上则采用 .so 后缀名。在本文中,我们将介绍如何使用 MFC 调用 C 语言编写的动态。 # 创建动态 在 Windows 平台上,可以使用 Visual Studio 创建动态。下面是一个简单的示例: ```c // mydll.h #ifndef MYDLL_H #define MYDLL_H #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) int add(int a, int b); #ifdef __cplusplus } #endif #endif // MYDLL_H // mydll.c #include "mydll.h" int add(int a, int b) { return a + b; } ``` 这个动态包含一个 add 函数,可以对两个整数求和。 # 调用动态 在 MFC 项目中调用动态,需要进行以下几个步骤: 1. 定义一个函数指针类型,指向动态中的函数。 ```c++ typedef int (*AddFunc)(int, int); ``` 2. 加载动态。 ```c++ HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } ``` 3. 获取动态中的函数地址。 ```c++ AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } ``` 4. 调用动态中的函数。 ```c++ int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); ``` 5. 卸载动态。 ```c++ FreeLibrary(hinstLib); ``` 完整的 MFC 代码示例: ```c++ typedef int (*AddFunc)(int, int); void CMyDlg::OnButton1() { HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); FreeLibrary(hinstLib); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值