zoukankan      html  css  js  c++  java
  • C#调用C++动态库

    这是关于一个精密设备的上位机,设备提供了封装好的动态库文件Sense2020Dll.dll文件,还给了一个用MFC建的示例。

    我尝试使用MFC单文档方式建立文件,以后再写这个。今天把遇到的问题及解决的方法写一下。

    1.如何引入动态库DLL

     使用System.Runtime.InteropServices类,调用DLL,EntryPoint输入函数名。

    1         [DllImport("Sense2020Dll.dll", EntryPoint = "DLL_Open_Device")]
    2         private static extern bool DLL_Open_Device();

    2.关于数据类型的转换

    说一下自己遇到的类型转换

    C++ C#
    boolean

    bool

    int *dllVersion

    ref int dllVersion

    string deviceSN

    intPtr deviceSN

    byte sensorMode

    byte sensorMode

    double *pdblTemp

    ref double pdblTemp

    doube *pdblPower

    [MarshalAs(UnmanagedType.LPArray, SizeConst = 512)] double[] pdblPower

    在转换string类型时,使用到了intPtr指针,在处理得到的结果时还要写如下语句:

    1                 IntPtr intptr = Marshal.StringToHGlobalAnsi("test");
    2                 DLL_Get_Device_SN(intptr);
    3                 deviceSN = Marshal.PtrToStringAnsi(intptr);

     对于最后一个类型转换,在C++函数中要传入double数组的指针并赋值,用到C#里面是没有的,需要用到marshal数组。

    具体请参考【http://www.kycis.com/blog/read.php?21

    具体请参考【http://www.kycis.com/blog/read.php?20

    3.其他

    3.1 C#跨线程调用控件问题

    可以直接加入一条语句:

    Control.CheckForIllegalCrossThreadCalls = false;

    还有更好的办法,具体这篇文章很好,C# 跨线程调用控件

    3.2 实现底部状态栏时间显示,分栏效果

    关键点:将Sprint属性为True,BorderSides属性为Left,Right

    具体操作详见这篇博客>>地址

    3.3 C#尝试读取或写入受保护的内存,这通常指示其他内存已损坏

    先检查DLL函数传递的参数是否有问题。

    具体操作详见这篇博客>>地址

  • 相关阅读:
    Electron踩坑记录
    TypeScript实现设计模式——生成器模式
    在express中使用ES7装饰器构建路由
    微信小程序下载文件(非图片),并校验扩展名。
    防抖与节流
    yarn
    spark
    docker php-fpm中安装GD库
    thinkphp6 多应用路由遇坑记
    CentOS 7 开启SSH远程登录
  • 原文地址:https://www.cnblogs.com/hujun1992/p/CSharpInvokeDll.html
Copyright © 2011-2022 走看看