zoukankan      html  css  js  c++  java
  • 在C#工程中调用C++的DLL

    原来的工程是用C++语言编写的。如果需要在C#工程中调用c++完成的功能模块,一个简单的做法就是将原有C++模块封装为动态链接库(DLL), 而在c#中直接导入已有的DLL 接口。具体的做法如下:

    (1) 将原来C++模块封装为DLL

    a.  创建和使用动态链接库

    (2) 在C#工程中声明导入的DLL中函数接口

    一个简单的实例如下:

    假设已有C++ 函数

    public static extern int tutorial (int* z, int* x, int * y ); // C++函数声明

    为了在C# 中调用tutorial函数,需要在相应的CS文件中导入相关的函数声明:

     using System.Runtime.InteropServices; 
    [DllImport("Demo.dll", //动态链接库的名称
    EntryPoint = "tutorial", //函数入口点,即函数名
    CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] //使用的字符集和其他
    public static extern int tutorial (ref int z, ref int x, ref int y ); // 函数原型声明

    需要注意的问题:

    (1) DLL应放在C#工程可以搜索到的路径下,即 a. 与C#工程可执行文件放在同一个目录下(path中设定了当前路径) b. 系统 path已列举的目录下. c. 工程引用的目录下。

    (2) 如果DLL中引用了其他的库,而这些库并不是在任何一台机器上都找得到的情况下,C#在调用DLL 函数时会出现找不到当前DLL的错误,此时可能是因为当前DLL所依赖的库函没有找到。此时,可以用 Dependency Walker 查看DLL库依赖情况,发现真正问题所在。当你发现你的代码在某些机器上可以正常运行,但是移植到其他机器上出现问题的时候,你需要留意这点:)

  • 相关阅读:
    Leetcode:169. 多数元素
    关系数据库
    数据库系统概述——简单总结
    Leetcode:1305. 两棵二叉搜索树中的所有元素
    Leetcode春季打卡第四天:994. 腐烂的橘子
    临界区和临界资源的关系
    线程2.线程的应用场景
    线程
    linux下的进程控制
    Go中的错误处理
  • 原文地址:https://www.cnblogs.com/lizi/p/2363070.html
Copyright © 2011-2022 走看看