如何使用封送处理在c#中像vb6中的类型一样执行结构数组

如何使用封送处理在c#中像vb6中的类型一样执行结构数组,c#,dll,vb6,marshalling,C#,Dll,Vb6,Marshalling,对不起,我解释得不好。dll不是用VB编写的,是用机器语言编写的,您实际上可以从vb6 delphi 7和c++中访问dll。连接方法“PBusConnectEx”在C#代码中运行良好。我真正的问题是,我在vb6中有一个“类型”,我不得不在C#中把它变成一个“结构” 第一个问题是,如果你认为C中的结构“结构”等价于VB6中的结构“类型”, 第二个问题是,如果您认为外部函数声明“PBusTransferPLUCluster”与VB6中的外部函数声明“PBusTransferPLUCluster”相

对不起,我解释得不好。dll不是用VB编写的,是用机器语言编写的,您实际上可以从vb6 delphi 7和c++中访问dll。连接方法“PBusConnectEx”在C#代码中运行良好。我真正的问题是,我在vb6中有一个“类型”,我不得不在C#中把它变成一个“结构”

第一个问题是,如果你认为C中的结构“结构”等价于VB6中的结构“类型”,

第二个问题是,如果您认为外部函数声明“PBusTransferPLUCluster”与VB6中的外部函数声明“PBusTransferPLUCluster”相比,做得很好。p> 第三个问题是:?与vb6中的PBusTransferPLUCluster函数调用相比,您认为应该如何调用PBusTransferPLUCluster函数以及必须发送的参数类型。?对不起,如果我知道我在上面解释,我是新来的论坛,英语写得不是很好

VB6代码单元1.bas

Attribute VB_Name = "Module1"
Type TPlu
   PLUName As String
   LFCode As Long
   Code As String
   BarCode As Long
   UnitPrice As Long
   WeightUnit As Long
   Deptment As Long
   Tare As Double
   ShlefTime As Long
   PackageType As Long
   PackageWeight As Double
   Tolerance As Long
   Message1 As Byte
   Reserved As Byte
   Reserved1 As Integer
   Message2 As Byte
   Reserved2 As Byte
   MultiLabel As Byte
   Rebate As Byte
   Account As Long
End Type

Type TPLUCluster
   PLU(0 To 3) As TPlu
End Type

Type THotkeyTable
   Hotkey(0 To 83) As Long
End Type

Declare Function PBusConnect Lib "PBusDrv.dll" (ByVal RefLFZKFileName As String, ByVal RefCFGFileName As String, ByVal SerialNO As Integer, ByVal CommName As String, ByVal BaudRate As Integer) As Long
Declare Function PBusDisConnect Lib "PBusDrv.dll" (ByVal SerialNO As Integer) As Long
Declare Function PBusTransferPLUCluster Lib "PBusDrv.dll" (ByRef PLUCluster As TPLUCluster) As Long
Declare Function PBusTransferHotkey Lib "PBusDrv.dll" (ByRef HotkeyTable As THotkeyTable, ByVal TableIndex As Long) As Long
Declare Function PBusPLUToStr Lib "PBusDrv.dll" (ByRef PLU As TPlu, ByVal LPStr As String) As Long
Declare Function PBusStrToPLU Lib "PBusDrv.dll" (ByVal LPStr As String, ByRef PLU As TPlu) As Long
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
第一单元

VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Sample for Windows NT 4.0"
   ClientHeight    =   1500
   ClientLeft      =   1770
   ClientTop       =   1710
   ClientWidth     =   2190
   LinkTopic       =   "Form1"
   PaletteMode     =   1  'UseZOrder
   ScaleHeight     =   1500
   ScaleWidth      =   2190
   Begin VB.CommandButton TestBtn 
      Caption         =   "Test"
      Height          =   375
      Left            =   360
      TabIndex        =   1
      Top             =   480
      Width           =   1335
   End
   Begin VB.Label Label1 
      AutoSize        =   -1  'True
      Height          =   195
      Left            =   1560
      TabIndex        =   0
      Top             =   4560
      Width           =   45
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

Private Sub TestBtn_Click()
Dim Result As Long
Dim PLUCluster As TPLUCluster
Dim PLU As TPlu
Dim HotkeyTable As THotkeyTable
Dim Str As String

PLU.PLUName = "chorizoxx"
PLU.LFCode = 1
PLU.Code = 1
PLU.Deptment = 1
PLU.UnitPrice = 21414
PLU.BarCode = 22
PLUCluster.PLU(0) = PLU

Result = PBusConnectEx(".\lfzk.dat", ".\system.cfg", "192.168.1.87")
Result = PBusTransferPLUCluster(PLUCluster)
Result = PBusDisConnect(1234)
Result = MessageBox(0, "Test OK", "Demo", 0)

End Sub
这是我的C#代码:

非常抱歉,如果我不能在上一篇文章中解释我的话。

Vb6中的Int在C中是短的,Vb6中的Long在C中是Int#

VB6没有像C中那样的64位长#

您可以在VB6中长时间(C#)创建UDT


请参见和

你好,大卫·坦克斯,以获取答案。您让我必须更改私有TPlu[]PPC=新TPlu[3];对于数组pluArray=新数组[4];?c#向我发送此错误:类型“System.Array”非泛型不能与类型参数一起使用(CS0308)。如果您只发布代码的一个子集,以便理解c#is[]generic is hello motes中的mechanicsarray,您的问题将得到改进。我非常感谢您,我解决了将长数据类型更改为int数据类型的问题。谢谢大家的帮助,请将鼠标放在我的答案旁边,单击绿色箭头接受它,并为我的答案投一分。这就是在stackvoerflowHello上接受和批准答案的方式。你知道,结构工作正常,但结构的一个变量(PLU.ShlefTime)在c#中会产生问题。当我运行应用程序时,她向我抛出以下错误:System.Runtime.InteropServices.SEHException:Un component externo produjo una execpción。en BALANZAC_uzac.Inventario.PBusTransferPLUCluster(TPlu[]PPC)。。。。如果你有什么想法,我将不胜感激。这个变量(PLU.ShlefTime)在vb6中运行良好,我不知道为什么所有变量在vb6中都运行良好,而PLU.ShlefTime是唯一一个不能运行良好的变量。double应该在两者中都是double。
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]

namespace BALANZAC_{

   public partial class MainForm : Form{

      struct TPlu{
      public string PLUName;
      public long LFCode;
      public string Code;
      public long BarCode;
      public long UnitPrice;
      public long WeightUnit;
      public long Deptment;
      public double Tare;
      public long ShlefTime;
      public long PackageType;
      public long PackageWeight;
      public long Tolerance;
      public byte Message1;
      public byte Reserved;
      public int Reserved1;
      public byte Message2;
      public byte Reserved2;
      public byte MultiLabel;
      public byte Rebate;
      public long Account;
   }

   private TPlu PLU;
   private TPlu[] PPC=new TPlu[3];

   [DllImport("PBusDrv.dll")]
   public static extern int PBusConnectEx(string RefLFZKFileName, string RefCFGFileName , string IPAddr);
   [DllImport("PBusDrv.dll")]

   private static extern int PBusTransferPLUCluster([MarshalAs(UnmanagedType.LPArray, SizeConst=3)]TPlu[] PPC);

      public MainForm()
         InitializeComponent();

         PBusConnectEx("lfzk.dat", "system.cfg", "192.168.1.87");
         PLU.PLUName="PRUEBA PESADO X1";
         PLU.Code="222";
         PLU.LFCode=222;
         PLU.Deptment=1;
         PLU.UnitPrice=12993;
         PLU.BarCode=22;
         PPC[0]=PLU;
         PLUCluster.PLU[0]=PLU;


        }
    }   
}
Type VB6Long64
   LoValue As Long
   HiValue As Long
End Type