通過C#調用託管DLL和非託管DLL檔案的區別

來源:互聯網
上載者:User

     首先解釋一下,託管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;

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

此文檔可以保留,參考。有不足之處,請大家給予指出回複。謝謝。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.