《精通.NET互操作1.2》C# PInvoke使用c++dll

书本章节:1.2 Hello,World实例程序

第一步:生成c++的dll,参考文章:https://blog.csdn.net/liyunxin_c_language/article/details/83210788

注意事项1:如果导出的dll出现函数名是乱码的情况,要在导出函数前增加 extern "C",如下

extern "C" MYDLL_API  int mySum(int a, int b)
{
return a + b;
}

注意事项2:

因为该头文件既被dll的源文件包含,又被使用方包含,所以开头使用条件编译——当被dll源文件包含时(#ifdef MYDLL_EXPORTS,因为vs生成的DLL项目默认都定义了DLL名称_EXPORTS这个宏),导出的函数前要加__declspec(dllexport)宏;如果是被使用方包含,则导出函数前要加__declspec(dllimport)宏

在vs中的创建步骤

创建项目。在vs中新建win32应用程序,名称为任意给定,如MyDll之类的,概述点击下一步,应用程序设置中的应用程序类型选择DLL(D),完成。

添加头文件。在项目-添加新项-**Visaul C++**中选择头文件,设置文件名如MyDll.h。

头文件代码如下:

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)//注意decl前面是两个下划线
#else
#define MYDLL_API __declspec(dllimport)
#endif

namespace MyDllSpace
{
    //导出类
    class MyDllClass
    {
    private:
        double a;
    public:
        //导出的函数
        MYDLL_API MyDllClass();
        MYDLL_API MyDllClass(double a_);
        MYDLL_API double multiply(double b);
        MYDLL_API void display();
        MYDLL_API static void conbine(MyDllClass m1, MyDllClass m2);
    };
}

源文件代码如下:

// MyDll.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "MyDll.h"
#include <iostream>

MyDllSpace::MyDllClass::MyDllClass()
{
    a = 0;
}

MyDllSpace::MyDllClass::MyDllClass(double a_)
{
    a = a_;
}

MYDLL_API double MyDllSpace::MyDllClass::multiply(double b)
{
    return a*b;
}

MYDLL_API void MyDllSpace::MyDllClass::display()
{
    std::cout << "a=" << a << std::endl;
}

MYDLL_API void MyDllSpace::MyDllClass::conbine(MyDllClass m1, MyDllClass m2)
{
    std::cout << "(" << m1.a << "," << m2.a << ")" << std::endl;
}

extern "C" MYDLL_API
int mySum(int a, int b)
{
    return a + b;
}

第二步,用C#调用刚才生成的C++的dll

将生成的dll拷贝到C#项目中的debug文件夹(和.exe放在同一个目录)

调用代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace PInvoke12
{
    class Program
    {
        static void Main(string[] args)
        {
            Win32APIcOnsoleHelloWorld.SayHelloWorld();
            int a = 1;
            int b = 2;
            int c = Win32APIcOnsoleHelloWorld.mySum(a, b);
            Console.Write(c.ToString());
            Console.WriteLine();
        }
    }

    class Win32APIcOnsoleHelloWorld
    {
        [DllImport("msvcrt.dll")]
        static extern int puts(string msg);

        [DllImport("msvcrt.dll")]
        static extern int _flushall();
        /// <summary>
        /// 调用自己写的dll
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        [DllImport("MyDll.dll")]
        public static extern int  mySum(int a, int b);
        public static void SayHelloWorld()
        {
            puts("Hello,world");
            _flushall();
        }
    }
}

 

 

 

posted @ 2019-11-16 16:19  xuelixue  阅读(310)  评论(0编辑  收藏  举报