2014-02-13 46 views
3

我昨天发布了关于如何将C程序转换为C#的第一个C#项目:Convert from C to C#, or make DLL?。我取得了很多进展,但我被困在一个部分。我不知道我应该如何去重建这个无符号的字符数组在C#中使用PInvoke的C无符号字符数组的等价

C代码:

unsigned char state_buf[5125]; 

//-------------------------------------------------------------------------- 
// Main of iSerial64 
// 
void main(int argc, char **argv) 
{ 
    char refresh,buf[200]; 
    short flag,i,didsetup=0; 
    short ROM[9]; 
    short PortNum,PortType; 
    long SHandle; 
    char serialtmp[2], serial[10][17]; 
    int j = -1; 

....

这是一个需要使用的PInvoke http://files.maximintegrated.com/sia_bu/licensed/docs/1-wire_sdk_win/TMEX/romm1rxq.html

state_buf在C#中的作用

C#我用来从api导入函数的代码:

[DllImport("IBFS64.dll")] 
     public static extern short TMRom(
      int session_handle, 
      byte state_buf, 
      [MarshalAs(UnmanagedType.LPStr)]StringBuilder ROM 
     ); 

我看到该字节是C#的等价物,但我不完全确定如何使用它。

到目前为止,你们都非常有帮助,我对这方面取得的进展感到非常满意。

这是我已经得到了,因为昨天在C#中完成:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace PInvokeTest { 
    class Program { 
    static void Main(string[] args) 
     { 
      int session_handle = 0; 
      int result = 0; 
      int flag = 0; 
      int didsetup = 0; 
      int defPort = 0; 
      int i = 0, j = -1; 
      short type_test = 0; 
      byte state_buf = 0; 
      short port_num = 0, port_type = 1; 
      StringBuilder ID_buf = new StringBuilder(); 
      StringBuilder serial = new StringBuilder(); 
      StringBuilder serialtmp = new StringBuilder(); 
      StringBuilder ROM = new StringBuilder(); 

      //result = TMSearch(session_handle, state_buffer, 1, 1, 0xEC); 


      defPort = TMReadDefaultPort(out port_num,out port_type); 


      if (defPort == 1) 
      { 
       Console.Write("Default Device: "); 

       switch (port_type) 
       { 
        case 1: 
         Console.Write("DS9097E serial adapter "); 
         break; 

        case 2: 
         Console.Write("Parallel adapter "); 
         break; 

        case 5: 
         Console.Write("DS90907U serial adapter "); 
         break; 

        case 6: 
         Console.Write("DS9490 USB adapter "); 
         break; 
       } 
       Console.Write("on port # {0}", port_num); 
      } 

      else 
       Console.Write("No Device found"); 

      // get the TMEX driver version 
      Get_Version(ID_buf); 

      Console.WriteLine("\nDriver: {0}", ID_buf); 

      type_test = TMGetTypeVersion(port_type, ID_buf); 

      if (type_test < 0) 
      { 
       Console.WriteLine("\nNo Hardware Driver for this type found!\n"); 
       Console.Write("Press any key to exit"); 
       Console.ReadKey(); 
       Environment.Exit(0); 
      } 
      else 
       Console.WriteLine("Driver Found"); 


      // check for valid range of PortNum 
      if ((port_num < 1) || (port_num > 15)) 
      { 
       Console.WriteLine("ERROR, invalid port requested: {0}\n", port_num); 
       Console.Write("Press any key to exit"); 
       Console.ReadKey(); 
       Environment.Exit(0); 
      } 


      do 
      { 
       // get a session handle to the requested port 
       session_handle = TMExtendedStartSession(port_num, port_type, IntPtr.Zero); 

       if (session_handle > 0) 
       { 
        // check to see if TMSetup has been done once 
        if (didsetup == 0) 
        { 
         flag = TMSetup(session_handle); 
         if (flag == 1 || flag == 2) 
         { 
          Console.Write("TMSetup complete {0}", flag); 
          didsetup = 1; 
         } 
         else 
         { 
          Console.Write("ERROR doing setup {0}", flag); 
          break; 
         } 
        } 

        else 
        { 
         //j was added to keep track of the serial number strings 
         j++; 

         //memset(serial[j], 0, strlen(serial[j])); 
         flag = TMNext(session_handle, state_buf); 
         if (flag > 0) 
         { 
          //ROM[0] = 0; 
          flag = TMRom(session_handle, state_buf, ROM); 
          for (i = 7; i >= 0; i--) 
          { 
           //This section was changed from the original 
           //copies raw number into string 
           //sprintf(serialtmp, "%02X", ROM[i]); 
           //strcat(serial[j], serialtmp); 

          } 
          Console.WriteLine("{0} \n", serial[j]); 

         } 
         else 
          Console.WriteLine("end of search\n"); 
        } 
        // close the opened session 
        TMEndSession(session_handle); 
       } 

      } 
      while (flag > 0); 






      Console.ReadKey(); 
     } 

    [DllImport("IBFS64.dll")] 
    public static extern int TMExtendedStartSession(
     short PortNum, 
     short PortType, 
     IntPtr EnhancedOptions 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short TMSearch(
     int session_handle, 
     byte state_buffer, 
     short p1, 
     short p2, 
     short p3 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short TMReadDefaultPort(
     out short port_num, 
     out short port_type 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short Get_Version(
     [MarshalAs(UnmanagedType.LPStr)]StringBuilder ID_buf 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short TMGetTypeVersion(
     short port_type, 
     [MarshalAs(UnmanagedType.LPStr)]StringBuilder ID_buf 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short TMSetup(
     int session_handle 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short TMNext(
     int session_handle, 
     byte state_buf 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short TMRom(
     int session_handle, 
     byte state_buf, 
     [MarshalAs(UnmanagedType.LPStr)]StringBuilder ROM 
    ); 

    [DllImport("IBFS64.dll")] 
    public static extern short TMEndSession(
     int session_handle 
    ); 
    } 
} 

让我知道如果有什么我应该改变。我感谢帮助!

+0

至于你应该改变的事情,P/Invoke方法应该真正在他们自己的专用类型中,你应该把你的主要方法分解成单独的方法和可能的类型。 – Magus

+0

第二个参数是byte []。第三个是短[],8个元素,而不是9个。你确实需​​要记录api,所以没有人猜测,只需提供[链接](http://files.maximintegrated.com/sia_bu/softdev/owdocs/Docs /TMEX/tmex3vlg.html) –

+0

第二个参数可以是IntPtr。很难说 –

回答

8

对于C语言数组:

unsigned char state_buf[5125] ; 

尝试C#

byte[] state_buf = new byte[5125] ; 

byte是与域0-255无符号的8位数字。如果你想要你的八位字节签名,使用sbyte(域-128到+127)。

+0

谢谢,它完美的作品! – user3232337