zoukankan      html  css  js  c++  java
  • C#调用C++ DLL动态库的两种方式

    第一种方式:C++导出函数, c#dllimport 的方式

    在很多地方都看到过,如[dllimport “user32.dll”]这种代码,调用windows API,就是通过这种方式实现

    例子:

    新建C++项目,创建动态链接库(DLL),然后添加头文件textdll.h

    #pragma once
    #ifdef A_EXPORTS
    #define DLL_API __declspec(dllexport)
    #else
    #define DLL_API __declspec(dllimport)
    #endif
    
    extern "C" DLL_API void MessageBoxShow();   //通过extern “C” 使MessageBoxShow方法为一个导出方法,外部可见

    然后,dllmain.cpp中添加代码:

    #include "stdafx.h"
    #include "textdll.h"
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    void MessageBoxShow()
    {
        MessageBox(NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);
    }
    
    
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif

    编译通过后,找到目录下生成的DLL(TESTDLL.dll),拷贝出来,放到C#的debug目录(程序目录)下

    然后新建C#程序:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;  //必须要添加该引用
    using System.Text;
    using System.Threading.Tasks;
    
    namespace dlltest
    {
        class Program
        {
            [DllImport("TESTDLL.dll")]  //最关键的,导入该dll
            public extern static void MessageBoxShow();
            static void Main(string[] args)
            {
                MessageBoxShow();
            }
        }
    }

    然后运行可以看到结果:成功的调用了C++DLL中的方法。

    第二种方式:

    通过C++/CLI作为中间层,因为C++/CLI即可调用.NET的类库,又可调用C++原生库,

    所以可以通过C# 调用 C++/CLI 再调用 C++ DLL这样的三层调用方式完成。

    未完待续。。。。。

  • 相关阅读:
    Prometheus监控MySQL服务(六)
    Prometheus监控Docker服务(五)
    Grafana与Prometheus集成(四)
    Prometheus监控Linux服务器(三)
    Prometheus配置文件(二)
    elasticdump数据迁移方法
    Prometheus介绍及二进制部署(一)
    PHP二维数组的引用赋值容易犯的错误
    Maven仓库国内镜像站
    加密文件之Java改进版
  • 原文地址:https://www.cnblogs.com/kevinWu7/p/10163517.html
Copyright © 2011-2022 走看看