首先解釋一下,託管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;
-------------------------------------
此文檔可以保留,參考。有不足之處,請大家給予指出回複。謝謝。