2014-02-13 44 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