• 通过C#调用托管DLL和非托管DLL文件的区别


         首先解释一下,托管DLL和非托管DLL的区别。狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。

         托管DLL文件,可以在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using  DLL命名空间,来调用相应的DLL对象 。

        非托管DLL文件,在Dotnet环境应用时,通过 DllImport 调用。

       C# 调用非托管DLL文件。DLL文件是用C语言编写的。
    如下:
    1:结构定义
      rditag_t  
      rditag_t结构定义了测点的结构
      typedef struct _rditag_t
      {
    char tagname[RDI_MAX_TAGNAME_LEN]; /*[in]*/
    float val; /*[out]*/
    int status; /*[out]*/
      } rditag_t;
      2:rditagname_t
      rditagname_t定义了测点名类型
      typedef char rditagname_t[RDI_MAX_TAGNAME_LEN];
    ----------------------------------------------------
    函数说明:
      1:void rdi_read(rditag_t tags[], int count, int timeout);
      参数
      tags 读取数据点数组。
      count 输入参数。
      timeout 输入参数。
      2: void rdi_read0(rditagname_t tagnames[], float values[], int statuses[], int count, int timeout);
    参数
    tagnames 输入参数。
    values 输出参数。
    statuses 输出参数。
    count 输入参数。
    timeout 超时值(毫秒)。
    返回值
    无。

        --以下是源码。及供参考学习。不能用于商业盈利。 
    public const string dll_name = "rdiapi.dll";
      public const byte RDI_MAX_TAGNAME_LEN = 0x18;
      public const int RDI_STS_FAILED = -1;
      public const int RDI_STS_INVALID_HANDLE = -2;
      public const int RDI_STS_INVALID_TAG = -5;
      public const int RDI_STS_NET_ERROR = -3;
      public const byte RDI_STS_OK = 1;
      public const int RDI_STS_TIMEOUT = -4;

      [DllImport("rdiapi.dll")]
      public static extern int rdi_close();
      [DllImport("rdiapi.dll")]
      public static extern int rdi_init();
      [DllImport("rdiapi.dll")]
      public static extern int rdi_isopen();
      [DllImport("rdiapi.dll")]
      public static extern int rdi_open(string server, int port);
      [DllImport("rdiapi.dll")]
      --用C#编写的函数(注意参数[In, Out] rditag_t[] tags 而不是 ref )
      public static extern int rdi_read([In, Out] rditag_t[] tags, int count, int timeout);
      [DllImport("rdiapi.dll")]
      public static extern int rdi_read0(rditag_t1[] tags, [In, Out] float[] value_array, [In, Out] int[] status_array, int count, int timeout);
      [DllImport("rdiapi.dll")]
      public static extern int rdi_uninit();
      -- 用C#定义结构
      [StructLayout(LayoutKind.Sequential)]
      public struct rditag_t
      {
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x18)]
      public string tagname;
      public float val;
      public int status;
      }
      -- 用C#定义结构 
      [StructLayout(LayoutKind.Sequential)]
      public struct rditag_t1
      {
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x18)]
      public string tagname;

    -------------------------------------

    此文档可以保留,参考。有不足之处,请大家给予指出回复。谢谢。

  • 相关阅读:
    九校联考-DL24凉心模拟Day2T2 整除(division)
    九校联考-DL24凉心模拟Day1T3 三米诺 (tromino)
    九校联考-DL24凉心模拟总结
    异常 日志-<多重catch语句>
    时间和日期实例-<Calender计算出生日期相差几天>
    时间和日期-<Date和SimpleDateFormat>
    实用类-<Math类常用>
    实用类-<字符串与基本类型的转换>
    实用类-<装箱与拆箱>
    HashMap的应用
  • 原文地址:https://www.cnblogs.com/honliv/p/1987433.html
Copyright © 2020-2023  润新知