通过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;

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

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

原文地址:https://www.cnblogs.com/honliv/p/1987433.html