2016-08-06 8 views
0

Ich versuche eine Struktur von einer Klasse zu initialisieren, die ich in meinem Code habe. Dies ist eine 3rd-Party-Klasse mit wenig oder gar keiner Dokumentation für .NET, also stecke ich in einer Initialisierung einiger Char-Variablen fest, die mit einer festen Länge innerhalb einer Struktur definiert wurden.Wie kann ich Char-Variablen fester Länge von einer Struktur korrekt initialisieren?

Dies ist die Struktur aus dieser 3. Teilklasse.

<StructLayout(LayoutKind.Sequential,Pack:=4)> _ 
Public Structure ODBSYS 
    Public addinfo As Short 
    Public max_axis As Short 
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _ 
    Public cnc_type As Char() 
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _ 
    Public mt_type As Char() 
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=4)> _ 
    Public series As Char() 
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=4)> _ 
    Public version As Char() 
    <MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _ 
    Public axes As Char() 
End Structure 

Und dies ist die Funktion arbeite ich an:

Private Function GetControlInfo() 
     Dim CNCSys As Focas1.ODBSYS 
     CNCSys.addinfo = 0 
     CNCSys.max_axis = 0 
     CNCSys.cnc_type = "" 
     CNCSys.mt_type = "" 
     CNCSys.series = "" 
     CNCSys.version = "" 
     CNCSys.axes = "" 

    Try 

     intHandleNo = Focas1.cnc_sysinfo(LibHndl, CNCSys) 

     MessageBox.Show("AddInfo: " & CNCSys.addinfo.ToString & vbCrLf & _ 
     "MaxAxis: " & CNCSys.max_axis.ToString & vbCrLf & _ 
     "CNCType: " & CNCSys.cnc_type.ToString & vbCrLf & _ 
     "MTType: " & CNCSys.mt_type.ToString & vbCrLf & _ 
     "Series: " & CNCSys.series.ToString & vbCrLf & _ 
     "Version: " & CNCSys.version.ToString & vbCrLf & _ 
     "Axes: " & CNCSys.axes.ToString) 
    Catch ex As Exception 
     MessageBox.Show(ex.ToString) 
    End Try 

    Return Nothing 

End Function 

Wenn ich hinzufügen dont diese Variable Initialisierung Code direkt nach der Erstellung von KSYS:

 CNCSys.addinfo = 0 
     CNCSys.max_axis = 0 
     CNCSys.cnc_type = "" 
     CNCSys.mt_type = "" 
     CNCSys.series = "" 
     CNCSys.version = "" 
     CNCSys.axes = "" 

I Holen Sie sich die nervige Nachricht im Fehlerlistenbereich (Weil ich die Variablen nicht von der Struktur initialisiere):

"Warnvariable 'CNCSys' wird als Referenz übergeben, bevor ihr ein Wert zugewiesen wurde. Eine NULL-Referenzausnahme könnte zur Laufzeit auftreten. Stellen Sie sicher, dass die Struktur oder alle Referenzelemente vor der Verwendung initialisiert werden. "

Ok, Hinzufügen dieses Codes löst die Warnung von nicht initialisierten Variablen, ich kann die Lösung erstellen und ausführen, es ... aber wenn die Funktion GetControlInfo genannt wird, erhalte ich diese excception:

„Typ nicht serialisiert werden, da die Länge eines eingebetteten Array-Instanz im Layout die angegebene Länge nicht übereinstimmt“

ich glaube Es ist, weil diejenigen, Variablen sind Char Vars in der Struktur, und sie haben feste Längen ... und ich bin nicht irgendwie initiizin g sie mit den gleichen Längen, die sie in der Struct-Definition haben ...

Was mache ich hier falsch? Wie kann ich sie initialisieren, damit der Compiler mir keine Nachrichten über nicht initialisierte Variablen liefert, aber auch keine Probleme mit dem Marshalling?

Danke!

Antwort

0

Die Definition sagt Ihnen, wie viele Zeichen jede Zeichenfolge haben sollte, also versuchen Sie "" anstelle von "", wo SizeConst = 2. Nicht sicher, ob die Größe in Bytes ist, versuchen Sie in diesem Fall "".

ähnlich tun für die SizeConst = 4

0

sehen, ob dies auch

CNCSys.addinfo = 0S 
CNCSys.max_axis = 0S 
CNCSys.cnc_type = {" "c, " "c} 
CNCSys.mt_type = {" "c, " "c} 
CNCSys.series = {" "c, " "c, " "c, " "c} 
CNCSys.version = {" "c, " "c, " "c, " "c} 
CNCSys.axes = {" "c, " "c} 

hilft, GetControlInfo braucht eine As Klausel.