1
INTRO输入字符串不会更新与使用C#中的DllImport
原工作代码在VB6 ...但是,当我尝试转换,并在C#中使用它不起作用
问题
的问题是在这条线在c#
结果= Iso14443Anticoll(HANDLE,147,UID,多标签,0)
可变Uid
不包含(更新)不像VB6它
使用DLL IN VB6
Declare Function OpenCommPort Lib "MR705API.dll" Alias "[email protected]@[email protected]" (ByVal PortName As String, ByRef hCom As Long) As Long
Declare Function CloseCommPort Lib "MR705API.dll" Alias "[email protected]@[email protected]" (ByVal hCom As Long) As Long
Declare Function SetLED Lib "MR705API.dll" Alias "[email protected]@[email protected]" (ByVal hCom As Long, ByVal Led As Byte, ByVal Addr As Byte) As Long
Declare Function ActiveBuzzer Lib "MR705API.dll" Alias "[email protected]@[email protected]" (ByVal hCom As Long, ByVal DelayTime As Byte, ByVal Addr As Byte) As Long
Declare Function Iso14443Reqa Lib "MR705API.dll" Alias "[email protected]@[email protected]" (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 "[email protected]@[email protected]" (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在C#
[DllImport ("MR705API.dll",
EntryPoint="[email protected]@[email protected]")]
public static extern int OpenCommPort(string portName, ref int hCom);
[DllImport ("MR705API.dll",
EntryPoint="[email protected]@[email protected]")]
public static extern int CloseCommPort(int hCom);
[DllImport ("MR705API.dll",
EntryPoint="[email protected]@[email protected]")]
public static extern int SetLED(int hCom, Byte Led , Byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="[email protected]@[email protected]")]
public static extern int ActiveBuzzer (int hcom, Byte DelayTime, Byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="[email protected]@[email protected]")]
public static extern int Iso14443Reqa (int hcom, Byte ReqAMode, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString ATQ, Byte Addr);
[DllImport ("MR705API.dll",
EntryPoint="[email protected]@[email protected]"]
public static extern int Iso14443Anticoll (int hcom, Byte AnticollMode, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString Uid, Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString MultiTag, Byte Addr);
在C#
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转换为C# ,这些问题已经解决
- 在VB6相当于INT INT C#长
- 入口点需要设置防止
System.EntryPointNotFoundException
的DLL函数
- 输入错误签名可能会导致
System.AccessViolationException
为什么是'FixedLengthString'并不仅仅是'string'? – DavidG 2014-11-03 01:11:56
@DavidG实际上,我不知道现在我的问题是什么原因,所以我尝试使我的代码几乎从vb6的旧版本开始,因此我使用它的原因 – 2014-11-03 01:14:47
但是您不调用VB6编写的DLL,所以为什么参数类型使用它? – DavidG 2014-11-03 01:16:02