在一個酒店門鎖對接的介面檔案中,有下面這些組件:

介面檔案部分:

根據檔案來看的話,應該是C++寫的dll,但我是只會c#。
請問,組件中的.lib檔案和.dll檔案怎么使用?怎么完成門鎖對接呢?
uj5u.com熱心網友回復:
找到 dll 函式說明,然后 import dll,網上很多的。不過關鍵是 C++ 的資料結構與 C# 不大一樣,你還要仔細去匹配。uj5u.com熱心網友回復:
上面方法中有一個“*”符號,c#呼叫的時候,怎么處理呢uj5u.com熱心網友回復:
你這個我好像寫過一個根你一樣的門鎖介面uj5u.com熱心網友回復:
你這是不是叫proUsb的uj5u.com熱心網友回復:
[DllImport("proRFL.DLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int GetDLLVersion(StringBuilder bufVer);
uj5u.com熱心網友回復:
嗯,你是用c#寫的嗎?
uj5u.com熱心網友回復:
報錯,你能分享一下你的代碼么?
uj5u.com熱心網友回復:
dll這樣放的:

是什么原因?
uj5u.com熱心網友回復:
專案中添加參考,參考這個dlluj5u.com熱心網友回復:
還是不行
uj5u.com熱心網友回復:
BadImageFormatException經常是64位宿主不能加裝32位dll,或32位宿主不能加裝64位dll。右鍵專案 - 屬性 - 編譯 - 目標,把‘Any CPU’改成x86。(或x64如果dll是64位的)。
uj5u.com熱心網友回復:
你說的是這里吧

剛試過了,還是不行。報錯:無法加載 DLL“proRFL.DLL”: 找不到指定的模塊。
uj5u.com熱心網友回復:
1、確認proRFL.DLL在‘當前目錄’2、確認proRFL.DLL的依賴dll都在,可以用dumpbin工具(運行VisualStudio開發命令列視窗):
c:\...\bin\Debug\>dumpbin.exe /DEPENDENTS proRFL.DLL
uj5u.com熱心網友回復:
有的C++的dll,C#呼叫不了,例如MFC,wxwidgets等,原生態的C++庫才行最好是直接寫C++程式
uj5u.com熱心網友回復:
這兩點都確認沒問題
uj5u.com熱心網友回復:
。我以前寫過這個,關于外部DLL參考的部分,我給你貼一下,不過我沒用到檢查DLL版本的方法
/// <summary>
/// 打開USB
/// </summary>
/// <param name="d12">USB型別,對于proUSB固定為1</param>
/// <returns>0表示成功,否則失敗</returns>
[DllImport("proRFL.DLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int initializeUSB(byte d12);
///// <summary>
///// 關閉USB埠
///// </summary>
///// <param name="d12">USB型別,對于proUSB固定為1</param>
//[DllImport("proRFL.DLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
//public static extern void CloseUSB(byte d12);
/// <summary>
/// 讀卡器蜂鳴
/// </summary>
/// <param name="dl2">USB型別,對于proUSB固定為1</param>
/// <param name="t">鳴叫時間,乘以10毫秒</param>
/// <returns>0表示成功,否則失敗</returns>
[DllImport("proRFL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int Buzzer(byte dl2, byte t);
/// <summary>
/// 發行“客人卡”,又稱“賓客卡”或“房卡”
/// </summary>
/// <param name="dl2"> USB型別,對于proUSB固定為1</param>
/// <param name="dlsCoID">酒店標識,可以從現有卡片讀取</param>
/// <param name="CardNo">同一分鐘內發卡最多16張,每發一張卡加1</param>
/// <param name="dai">客人代,0--255,用于后卡覆寫前卡,一般情況下固定為0</param>
/// <param name="LLock">反鎖標志,1能開反鎖,0不能開反鎖</param>
/// <param name="Pdoors">公共門標志,1能開公共門,0不能開</param>
/// <param name="BDate">發卡時間10位數字字串,包含年月日時分,各占兩位 例:'0905201345'表示2009/05/20 13:45</param>
/// <param name="EDate">退房時間10位數字字串,包含年月日時分,各占兩位</param>
/// <param name="LockNo">鎖號8位數字字串,從門鎖軟體的房間定義里獲取</param>
/// <param name="cardHexStr">回傳的卡資料字串</param>
/// <returns>0表示成功,否則失敗</returns>
[DllImport("proRFL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int GuestCard(byte dl2, int dlsCoID, int CardNo, byte dai, byte LLock, byte Pdoors, char[] BDate, char[] EDate, char[] LockNo, StringBuilder cardHexStr);
/// <summary>
/// 讀取卡片資料
/// </summary>
/// <param name="d12"> USB型別,對于proUSB固定為1</param>
/// <param name="buffData">回傳的卡資料字串,有資料頭551501表示成功,從第25個字符開始的8個字符是卡的唯一號,也成為卡的ID號</param>
/// <returns>0表示成功,否則失敗</returns>
[DllImport("proRFL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int ReadCard(byte dl2, StringBuilder buffData);
/// <summary>
/// 注銷卡片
/// </summary>
/// <param name="dl2">USB型別,對于proUSB固定為1</param>
/// <param name="dlsCoID">酒店標識,可以從現有卡片讀取</param>
/// <param name="cardHexStr">回傳的卡資料字串</param>
/// <returns>0表示成功,否則失敗</returns>
[DllImport("proRFL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int CardErase(byte dl2, int dlsCoID, StringBuilder cardHexStr);
/// <summary>
/// 在登記入住制卡成功之后需要呼叫CheckIn將制卡資訊回傳給酒店軟體
/// </summary>
/// <param name="ARoomNumber"></param>
/// <returns></returns>
[DllImport("mplock.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)]
public static extern int CheckIn(StringBuilder ARoomNumber);
/// <summary>
/// 在結賬退卡成功之后需要呼叫CheckOut將退卡資訊回傳給酒店軟體
/// </summary>
/// <param name="ARoomNumber"></param>
/// <returns></returns>
[DllImport("mplock.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int CheckOut(StringBuilder ARoomNumber);
uj5u.com熱心網友回復:
你呼叫之前需要先實體化一個StringBuilder,然后傳進去另外,你需要把門鎖提供給你的所有檔案都放到你的程式相同目錄下(就是你的程式集編譯后的路徑),還有上面提到的,把架構改成X86除錯看看
uj5u.com熱心網友回復:
建議用C++/CLI封裝一下 然后給C#呼叫uj5u.com熱心網友回復:
import 匯入你的C++函式 在C#呼叫uj5u.com熱心網友回復:
找到 dll 函式說明,然后 import dlluj5u.com熱心網友回復:
找到 dll 函式說明,然后 import dll,試下這個uj5u.com熱心網友回復:
沒有分,怎么下載東西,郁悶uj5u.com熱心網友回復:
分享一下代碼好么uj5u.com熱心網友回復:
[code=csharp]
/// <summary>
/// 打開USB
/// </summary>
/// <param name="d12">USB型別,對于proUSB固定為1</param>
/// <returns>0表示成功,否則失敗</returns>
[DllImport("proRFL.DLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int initializeUSB(byte d12);
你寫的這些,在介面檔案里面都有,你說一下呼叫上面這個initializeUSB方法是怎么傳引數的?
uj5u.com熱心網友回復:
建議用C++/CLI封裝一下 然后給C#呼叫
C++/CLI是啥,外部DLL本身就是DLL寫的啊,還要把這個DLL怎么封裝一下嗎?
uj5u.com熱心網友回復:
找到 dll 函式說明,然后 import dll

DLL不是只讀檔案,但是添加不了參考
uj5u.com熱心網友回復:
建議用C++/CLI封裝一下 然后給C#呼叫
C++/CLI是啥,外部DLL本身就是DLL寫的啊,還要把這個DLL怎么封裝一下嗎?
C++/CLI是.netC++ 可以無縫銜接原生C++和C# 有一些DLL可能只能由C++呼叫 這個時候用C++/CLI進行呼叫 然后再封裝成托管介面 給C#
uj5u.com熱心網友回復:
[code=csharp]
/// <summary>
/// 打開USB
/// </summary>
/// <param name="d12">USB型別,對于proUSB固定為1</param>
/// <returns>0表示成功,否則失敗</returns>
[DllImport("proRFL.DLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int initializeUSB(byte d12);
你寫的這些,在介面檔案里面都有,你說一下呼叫上面這個initializeUSB方法是怎么傳引數的?
[DllImport("proRFL.DLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int initializeUSB(byte d12);
這不就時把proRFL.dll里的函式轉成了C#的方法嗎?
呼叫的時候直接寫 initializeUSB(byte d12);就行了啊,引數是byte型別了
uj5u.com熱心網友回復:
試一試,我用過的方法。分有點少
[DllImport("proRFL.DLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int GetDLLVersion(byte[] ersion);
private void button1_Click(object sender, EventArgs e)
{
string sversion = "";
byte[] bversion = new byte[1024]; //陣列大小要足夠容納回傳值
int code = GetDLLVersion(bversion);
for (int i = 0; i<bversion.Length; i++)
{
if (bversion[i] == 0)
{
sversion = Encoding.Default.GetString(bversion, 0, i);
break;
}
}
MessageBox.Show("回傳值:" + sversion, "狀態碼:" + code.ToString());
}
uj5u.com熱心網友回復:
有些看不懂。uj5u.com熱心網友回復:
指標型別 你就不能 寫個out ?轉載請註明出處,本文鏈接:https://www.uj5u.com/net/90670.html
標籤:C#
下一篇:c#listview加載資料閃爍
