相当于 C# 中使用 PInvoke 的 C 无符号字符数组



我昨天发布了关于如何将 C 程序转换为 C# 作为我在这里的第一个 C# 项目的文章:从 C 转换为 C#,还是制作 DLL?。我已经取得了很大的进步,但我被困在一个部分。我不确定我应该如何重新创建这个无符号的字符数组

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;

....

这是 C# 中的函数,它使用 PInvoke http://files.maximintegrated.com/sia_bu/licensed/docs/1-wire_sdk_win/TMEX/romm1rxq.html 获取state_buf

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

 [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 searchn");
                  }
                  // 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
    );
  }
}

如果有什么我应该改变的,请告诉我。我感谢您的帮助!

对于 C 语言数组:

unsigned char state_buf[5125] ;

尝试使用 C#

byte[] state_buf = new byte[5125] ;

byte 是一个无符号的 8 位数字,域为 0-255。如果要对八位字节进行签名,请使用sbyte(域 -128 到 +127)。

最新更新