zoukankan      html  css  js  c++  java
  • 使用C#调用C++类库

    环境:win10+VS2017

    过程介绍:

    1.使用C++编写一个动态库(DLL);

    2.将DLL内函数导出;

    3.使用C#进行调用;

    4.方法调用;

    5.在VS进行调试;

    1.使用C++编写简单的DLL;

    1.1创建项目(x64);

     在VS2017中新建->项目->Visual C++->Windows桌面->动态链接库;

    在项目属性中->常规中选择无公共语言支持,即不创建托管C++类库;

    1.2添加类和方法;

    在该类的.cpp文件中声明方法;

    自定义一个结构体

    在方法的参数中使用结构体,

    方法种类:

    A类: int TestFunc(int a);

    B类:int Funci2(char * c);

    C类:char * Funcc(int a);

    D类:char Funcc2();

    E类: int GetMyIntroStruct(MyIntroStruct* mystr, int* c);

     F类:int SetMyIntroStruct(MyIntroStruct mystr, int index);

     1.3 将方法导出;

    这里使用extern "C" __declspec(dllexport)标记方法的方式进行导出;

    也可以使用.def文件进行导出;

     2 编译完后,使用Denpends工具,打开该Dll,查看标记是否都已导出;

    3.在C#中进行添加和调用;

    这里采用DllImport特性标记方式进行导入

     这里需要注意类型得对应问题:

    参数:  

      C++字符串(char *)->C# string

      C++字符串(char *)->C# Intptr 

      C++结构体->C# Intptr

      结构体指针->C# Intptr

      整形指针->C# ref int

    在C#类中添加相应结构的自定义结构体(注意结构体的顺序),指定结构的内存分布为顺序分布;

     4.方法调用;

      对于参数传入类型:

      A类,B类方法,可以直接调用;

      对于Inptr参数的方法,可以在C#内申请内存空间传入C++中进行赋值,并需要对指针释放;

    对于传出的参数Intptr类型的可以进行数据读取,将Intptr转换为string类型:

    对于自定义结构体的Intptr指针可以通过对指针偏移获取数据:

    2018.3.26

  • 相关阅读:
    【Javascript】javascript学习 十六 JavaScript 事件
    【Javascript】javascript学习 十七/八/九 Try...Catch/Throw/OnError 语句
    【VB】VB ListView控件转载
    【VB6.0】VB常用术语/内部函数
    【Javascript】javascript学习 二十 JavaScript 特殊字符
    【VB】VB文件系统操作
    【C#】C#处理文本文件(转)
    【Javascript】javascript学习 十五 For...In 声明
    【C#】C#常用函數收集
    客户端和服务器端调用JavaScript函数
  • 原文地址:https://www.cnblogs.com/forevertime/p/8583875.html
Copyright © 2011-2022 走看看