2014-11-03 39 views
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# ,这些问题已经解决

  1. 在VB6相当于INT INT C#长
  2. 入口点需要设置防止System.EntryPointNotFoundException
  3. 的DLL函数
  4. 输入错误签名可能会导致System.AccessViolationException
+0

为什么是'FixedLengthString'并不仅仅是'string'? – DavidG 2014-11-03 01:11:56

+0

@DavidG实际上,我不知道现在我的问题是什么原因,所以我尝试使我的代码几乎从vb6的旧版本开始,因此我使用它的原因 – 2014-11-03 01:14:47

+0

但是您不调用VB6编写的DLL,所以为什么参数类型使用它? – DavidG 2014-11-03 01:16:02

回答

1

特别感谢到...

OKAY ...首先我要感谢@DavidG为我提供指导

回答我自己的问题...

由于DllImport函数签名不正确,输入字符串未更新。

我已经在这个LINK

该工具提供的名称和在不可控制的各功能使用签名依赖沃克提起鉴定我的DLL。dll的

enter image description here

所以,我必须改变一些功能的签名。

FOR EXAMPLE

Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString 字节[]

字节[]

字节字节

INT

这里是更新应答..

 [DllImport ("MR705API.dll", 
     EntryPoint="[email protected]@[email protected]")] 
     public static extern int OpenCommPort(string portName, ref IntPtr hCom); 

     [DllImport ("MR705API.dll", 
     EntryPoint="[email protected]@[email protected]")] 
     public static extern int CloseCommPort(IntPtr hCom); 

     [DllImport ("MR705API.dll", 
     EntryPoint="[email protected]@[email protected]")] 
     public static extern int SetLED(IntPtr hCom, byte Led , byte Addr); 

     [DllImport ("MR705API.dll", 
     EntryPoint="[email protected]@[email protected]")] 
     public static extern int ActiveBuzzer (IntPtr hcom, byte DelayTime, byte Addr); 

     [DllImport ("MR705API.dll", 
     EntryPoint="[email protected]@[email protected]")] 
     public static extern int Iso14443Reqa (IntPtr hcom, byte ReqAMode, byte[] ATQ, byte Addr); 

     [DllImport ("MR705API.dll", 
     EntryPoint="[email protected]@[email protected]")] 
     public static extern int Iso14443Anticoll (IntPtr hcom, byte AnticollMode,[InAttribute] byte[] Uid, byte[] MultiTag, byte Addr);