ВСТУПЛЕНИЕ
Исходный рабочий код находится в VB6... Но, когда я пытаюсь преобразовать и использовать в С#, он не работает
ПРОБЛЕМА
Проблема в этой строке в С#
Результат = Iso14443Anticoll (HANDLE, 147, Uid, MultiTag, 0)
Variable Uid
не содержит (обновляет) любое значение, в отличие от VB6, которое он делает
ИСПОЛЬЗОВАНИЕ DLL IN VB6
Declare Function OpenCommPort Lib "MR705API.dll" Alias "?OpenCommPort@@YGHPADPAPAX@Z" (ByVal PortName As String, ByRef hCom As Long) As Long
Declare Function CloseCommPort Lib "MR705API.dll" Alias "?CloseCommPort@@YGHPAX@Z" (ByVal hCom As Long) As Long
Declare Function SetLED Lib "MR705API.dll" Alias "?SetLED@@YGHPAXEE@Z" (ByVal hCom As Long, ByVal Led As Byte, ByVal Addr As Byte) As Long
Declare Function ActiveBuzzer Lib "MR705API.dll" Alias "?ActiveBuzzer@@YGHPAXEE@Z" (ByVal hCom As Long, ByVal DelayTime As Byte, ByVal Addr As Byte) As Long
Declare Function Iso14443Reqa Lib "MR705API.dll" Alias "?Iso14443Reqa@@YGHPAXEPAEE@Z" (ByVal hCom As Long, ByVal ReqAMode As Byte, ByVal ATQ As String, ByVal Addr As Byte) As Long
Declare Function Iso14443Anticoll Lib "MR705API.dll" Alias "?Iso14443Anticoll@@YGHPAXEPAE1E@Z" (ByVal hCom As Long, ByVal AnticollMode As Byte, ByVal Uid As String, ByVal MultiTag As String, ByVal Addr As Byte) As Long
ФУНКЦИОНАЛЬНЫЙ ВЫЗОВ В VB6
Dim HANDLE As Long
Dim Result As Long
Dim ATQ As String * 10
Dim Uid As String * 10
Dim MultiTag As String * 10
Dim ID As String
Dim Temp As String
Result = OpenCommPort(COMPORT, HANDLE)
If Result = 0 Then
Result = Iso14443Reqa(HANDLE, 82, ATQ, 0)
If Result = 0 Then
Result = SetLED(HANDLE, 1, 0)
Result = Iso14443Anticoll(HANDLE, 147, Uid, MultiTag, 0)
MsgBox Uid //there is value contained after input in Iso14443Anticoll()
...
...
End Sub
ИСПОЛЬЗОВАНИЕ DLL IN С#
[DllImport ("MR705API.dll",
EntryPoint="?OpenCommPort@@YGHPADPAPAX@Z")]
public static extern int OpenCommPort(string portName, ref int hCom);
[DllImport ("MR705API.dll",
EntryPoint="?CloseCommPort@@YGHPAX@Z")]
public static extern int CloseCommPort(int hCom);
[DllImport ("MR705API.dll",
EntryPoint="?SetLED@@YGHPAXEE@Z")]
public static extern int SetLED(int hCom, Byte Led , Byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="?ActiveBuzzer@@YGHPAXEE@Z")]
public static extern int ActiveBuzzer (int hcom, Byte DelayTime, Byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="?Iso14443Reqa@@YGHPAXEPAEE@Z")]
public static extern int Iso14443Reqa (int hcom, Byte ReqAMode, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString ATQ, Byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="?Iso14443Anticoll@@YGHPAXEPAE1E@Z"]
public static extern int Iso14443Anticoll (int hcom, Byte AnticollMode, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString Uid, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString MultiTag, Byte Addr);
ФУНКЦИОНАЛЬНЫЙ ВЫЗОВ С#
int HANDLE = 0;
int Result = 0;
Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString Uid = new FixedLengthString(10);
Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString ATQ = new FixedLengthString(10);
Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString MultiTag = new FixedLengthString(10);
string ID;
string Temp;
string IDNow;
Result = OpenCommPort("COM9", ref HANDLE);
if (Result == 0) {
Result = Iso14443Reqa(HANDLE, 82, ATQ, 0);
if (Result == 0) {
Result = SetLED(HANDLE, 1, 0);
Result = Iso14443Anticoll(HANDLE, 147, Uid, MultiTag, 0);
Debug.WriteLine("Uid :: " + Uid);
//There is no any update value just contained length = 10
....
....
ДОПОЛНИТЕЛЬНЫЙ
Я уже искал некоторую информацию для конвертации из VB6 в С#, эта проблема была решена
System.EntryPointNotFoundException
System.AccessViolationException
СПЕЦИАЛЬНОЕ СПАСИБО..
OKAY... Прежде всего, я хочу поблагодарить @DavidG за руководство мной
ОТВЕТИТЬ СВОЙ СОБСТВЕННЫЙ ВОПРОС...
Строка ввода не обновляется из-за неправильной подписи DllImport.
Я идентифицировал свою DLL, используя Dependencies Walker, как упоминание в этой LINK
Инструмент предоставляет имя и подпись каждой функции в неуправляемом.dll
Итак, у меня есть замена некоторой сигнатуры функции.
НАПРИМЕР
Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString to byte []
строка в байт []
Байт в байт
long to int
ЗДЕСЬ ОБНОВЛЕННЫЙ ОТВЕТ..
[DllImport ("MR705API.dll",
EntryPoint="?OpenCommPort@@YGHPADPAPAX@Z")]
public static extern int OpenCommPort(string portName, ref IntPtr hCom);
[DllImport ("MR705API.dll",
EntryPoint="?CloseCommPort@@YGHPAX@Z")]
public static extern int CloseCommPort(IntPtr hCom);
[DllImport ("MR705API.dll",
EntryPoint="?SetLED@@YGHPAXEE@Z")]
public static extern int SetLED(IntPtr hCom, byte Led , byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="?ActiveBuzzer@@YGHPAXEE@Z")]
public static extern int ActiveBuzzer (IntPtr hcom, byte DelayTime, byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="?Iso14443Reqa@@YGHPAXEPAEE@Z")]
public static extern int Iso14443Reqa (IntPtr hcom, byte ReqAMode, byte[] ATQ, byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="?Iso14443Anticoll@@YGHPAXEPAE1E@Z")]
public static extern int Iso14443Anticoll (IntPtr hcom, byte AnticollMode,[InAttribute] byte[] Uid, byte[] MultiTag, byte Addr);
FixedLengthString
а не простоstring
?