// 宣告
[DllImport("RTDBInterface.dll", EntryPoint = "AppendRTTagDataByTagName", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int AppendRTTagDataByTagName([MarshalAs(UnmanagedType.AsAny)]InsertData_struct dt);
//簡單的代碼
String[] veParams = new string[4];
veParams[0] = "D:\\vestore\\";
veParams[1] = "C:\\Windows\\SysWOW64\\";
veParams[2] = "";
veParams[3] = "";
InitConnect(veParams, 1000000);
InsertData_struct dt = new InsertData_struct();
dt.type = 0;
dt.status = 1;
dt.time = 1607435725;
dt.value = 990.99;
dt.pointName = "dcs01.TEST0000";;
int rs4 = AppendRTTagDataByTagName(dt);
this.listBox1.Items.Add("寫:"+ rs4 + " - > " + dt.value);
// C++ 結構體
typedef struct InsertData_struct{
int type; //為 0 則為開關量,為 1 則為摸擬量
int status; //寫入點記錄的狀態
double value; //寫入點記錄的值
long time; //寫入點記錄的時間,秒
char pointName[RTDB_TAGNAME_LENGTH]; //寫入點的完整點名
}InsertData;
// C# 結構體
public struct InsertData_struct{
public int type; //為 0 則為開關量,為 1 則為摸擬量
public int status; //寫入點記錄的狀態
public double value; //寫入點記錄的值
public long time; //寫入點記錄的時間,秒
public string pointName; //寫入點的完整點名
};
//////////////////////////////////////////////////////////////////////
例外出現如下錯誤
uj5u.com熱心網友回復:
C#的int 是int32,而C++的是int16,你需要根據C#和C++型別對應關系進行修改,不光int,C++的char*一般在C#里面要用StringBuilder來代替.去搜個型別對照表參考下吧.uj5u.com熱心網友回復:
是修改結構體那部分嗎?
uj5u.com熱心網友回復:
對呀uj5u.com熱心網友回復:
對呀 C#的int 是int32,而C++的是int16,你需要根據C#和C++型別對應關系進行修改,不光int,C++的char*一般在C#里面要用StringBuilder來代替.去搜個型別對照表參考下吧.
是修改結構體那部分嗎?
只有在增加
[MarshalAs(UnmanagedType.LPStr)]
這個代碼的時候,才會報錯“無法封送處理“parameter #1”: 無效的托管/非托管型別組合(該值型別必須與 Struct 成對出現)。”
[DllImport("RTDBInterface.dll", EntryPoint = "AppendRTTagDataByTagName", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int AppendRTTagDataByTagName([MarshalAs(UnmanagedType.LPStr)] InsertData_struct dt);
結構體增加了
public struct InsertData_struct{
[MarshalAs(UnmanagedType.U4)]
public int status;
[MarshalAs(UnmanagedType.U4)]
public int type;
[MarshalAs(UnmanagedType.R8)]
public double value;
[MarshalAs(UnmanagedType.U8)]
public long time;
[MarshalAs(UnmanagedType.LPTStr)]
public string pointName;
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/232239.html
標籤:C#
上一篇:C#(八)基礎篇—繼承和多型
下一篇:tfs 安裝了Team Foundation Power Tools插件了,但是還是不顯示process editor
