[DllImport("ACTS1011_64.DLL")]
public static extern Boolean ACTS1011_InitDeviceAD(IntPtr hDevice,ref PCle8914_PARA_AD pADPara);呼叫了外部dll函式,里面引數是一個結構體,我也定義了相應的結構體,在x86平臺下除錯可以,但是x64下調時就會閃退且沒有原因
VC的頭檔案是這樣的
typedef struct _ACTS1011_PARA_AD
{
LONG bChannelArray[8]; // 采樣通道選擇陣列,分別控制8個通道,=TRUE表示該通道采樣,否則不采樣
LONG InputRange[8]; // 模擬量輸入量程選擇
LONG CouplingType[8]; // 耦合型別(直流耦合, 交流耦合)
LONG InputImped[8]; // 輸入阻抗控制陣列,分別控制8個通道(暫不支持)
LONG FreqDivision; // 分頻數[1, 2147483647],外時鐘:采樣頻率=外部時鐘頻率/分頻數;其它時鐘:采樣頻率=基準頻率/分頻數;
LONG SampleMode; // 采樣模式(有限采樣,連續采樣)
ULONG M_Length; // M段長度(字),延時觸發M表示延時點數范圍[0, 4294967295],有限點采樣延時觸發有效
ULONG N_Length; // N段長度(字),有限點采樣有效
// 后觸發M必須為0,N為有效讀取點數;硬體延時觸發N為有效讀取點數;
// N*使能通道數*觸發次數 必須為2048的整數倍
LONG PFISel; // PFI功能選擇, 詳見下面常量定義(僅板卡8582 8584支持)
LONG TriggerMode; // 觸發模式選擇
LONG TriggerSource; // 觸發源選擇
LONG TriggerDir; // 觸發方向選擇(下降沿/上升沿/上下邊沿均觸發)
LONG TrigLevelVolt; // 觸發電平(量程按模擬輸入量程)
LONG TrigWindow; // 觸發靈敏窗單位nS,步進為本卡最高采樣率的采樣周期;例如最高80M,步進即為12.5nS
ULONG TrigCount; // 觸發次數設定,默認為1,為0時表示無限觸發,此功能僅在有限采樣下有效
LONG ReferenceClock; // 參考時鐘選擇
LONG TimeBaseClock; // 采樣時基選擇
LONG bMasterEn; // 主設備使能
// =0:從設備,接收主設備發送的同步觸發信號
// =1:主設備,為從設備發送自身的觸發信號
// 注:在多模塊同步系統中,只能設定其中一個設備為主設備,其余需設定為從設備,如果系統中只有一個設備或者有多個設備但是不要求同步,需將所有設備設定為從設備
LONG SyncTrigSignal; // 同步觸發源
LONG bClkOutEn; // 時鐘是否輸出,TRUE輸出
LONG ClkOutSel; // 時鐘輸出選擇
LONG bTrigOutEn; // 觸發是否輸出,TRUE輸出
LONG TrigOutPolarity; // 觸發輸出極性
LONG TrigOutWidth; // 觸發脈沖輸出寬度單位nS,[50, 50000]步進50nS
BOOL bSaveFile; // 是否自動存盤 =TRUE:存盤
TCHAR chFileName[256]; // 存盤路徑及名稱,例:L"F:\\1.pci"
} ACTS1011_PARA_AD, *PACTS1011_PARA_AD;
c#里是這樣的
public struct PCle8914_PARA_AD
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public long[] bChannelArray; // 采樣通道選擇陣列,分別控制個通道,=TRUE 表示該通道采樣,否則不采樣(只支持種通道配置:0 01 0123)
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public long[] InputRange; // 模擬量輸入量程選擇
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public long[] CouplingType; // 耦合型別(直流耦合, 交流耦合)
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public long[] InputImped; // 輸入阻抗控制陣列,分別控制8個通道(暫不支持)
public long FreqDivision; // 分頻數[1, 2147483647],外時鐘:采樣頻率=外部時鐘頻率/分頻數;其它時鐘:采樣頻率=基準頻率/分頻數;
public long SampleMode; // 采樣模式(有限采樣,連續采樣)
public long M_Length; // M 段長度(字),延時觸發 M 表示延時點數范圍[0, 2147483647]
public long N_Length; // N 段長度(字)
// 中間觸發 M N 有效讀取點數;后觸發 M 必須為,N 有效讀取點數;預觸發 M 必須為,N 有效讀取點數; 硬體延時觸發 N 有效讀取點數;
// 各種觸發下有效讀取點數相加范圍[16/使能通道數, 記憶體大小(位元組)/2/使能通道數], 有效讀取點數相加必須為(16/使能通道數)的整數倍
public long PFISel; // PFI功能選擇, 詳見下面常量定義(僅板卡8582 8584支持)
public long TriggerMode; // 觸發模式選擇
public long TriggerSource; // 觸發源選擇
public long TriggerDir; // 觸發方向選擇(正向/負向觸發)
public long TrigLevelVolt; // 觸發電平(量程按模擬輸入量程)
public long TrigWindow; // 觸發靈敏窗單位 nS,步進 5nS
public ulong TrigCount; // 觸發次數設定,默認為次,此功能僅在后觸發和硬體延時觸發模式下有效,觸發次數* 有效讀取點數*使能通道數*2<=記憶體大小(位元組)
public long ReferenceClock; // 參考時鐘選擇
public long TimeBaseClock; // 采樣時基選擇
public long bMasterEn; // 主設備使能
// =0: 從設備,接收主設備發送的同步觸發信號
// =1: 主設備,為從設備發送自身的觸發信號
// 注: 在多模塊同步系統中,只能設定其中一個設備為主設備,其余需設定為從設備,如果系統中只有一個設備或者有多個設備但是不要求同步,需將所有設備設定為從設備
public long SyncTrigSignal; // 同步觸發源
public long bClkOutEn; // 時鐘是否輸出,TRUE 輸出
public long ClkOutSel; // 時鐘輸出選擇
public long bTrigOutEn; // 觸發是否輸出,TRUE 輸出16
public long TrigOutPolarity; // 觸發輸出極性
public long TrigOutWidth; // 觸發脈沖輸出寬度單位 nS,[50, 50000]步進 nS
public bool bSaveFile; // 是否自動存盤 =TRUE:存盤
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public char [] chFileName; // 存盤路徑及名稱,例如:"F:\\1.pci"
}
uj5u.com熱心網友回復:
1.C++的long對應C#的int long long對應C#long2.TCHAR根據字符編碼不同 位數也不一樣 有可能是一個位元組 有可能是2或者4個位元組
uj5u.com熱心網友回復:
在C#結構體上面加上 [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]這個uj5u.com熱心網友回復:
改為int 前面加上了還是閃退
uj5u.com熱心網友回復:
重點是x86平臺下呼叫32位dll是可以的 但是x64位下呼叫64位dll就不行
uj5u.com熱心網友回復:
好像是tchar的原因 這個型別的變數會變uj5u.com熱心網友回復:
dll是你們自己寫的嗎 改下介面改成char好一點 如果不是 就用CLI或者C++包裝一下uj5u.com熱心網友回復:
exe和dll的架構必須都同時為x86或者x64而且c#里long和c++LONG長度不一定一樣
c#里最好寫Int64,Int32這種
uj5u.com熱心網友回復:
x86運行正常,那么可以確定你的dll是32位的程式,那么也一定要讓你的exe程式也是32位程式才能夠呼叫的,而c#程式一般可以自動選擇,所以建議強制把c#程式改為32位編譯運行試一試uj5u.com熱心網友回復:
exe和dll的架構必須都同時為x86或者x64。或者2個都同時編譯為 any cpu。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/44654.html
標籤:VC.NET
