Problem mit Marshal As( UnmanagedType.ByValArray

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von matzemaschine.

    Problem mit Marshal As( UnmanagedType.ByValArray


    Hallo an Alle,

    ich habe ein Problem mit einen Array of Char das ich an eine c .Dll übergeben möchte. Wenn ich meine Daten übergeben möchte kommt immer der gleiche Fehler:


    "Der Typ konnte nicht gemarshallt werden, da die Länge einer eingebetteten Arrayinstanz nicht mit der im Layout deklarierten Länge übereinstimmt. "

    Das Array ist im Debugger auch nur mit der Größe 2 angegeben das eigentlich 256 groß sein müsste hat jemand eine Idee???

    Die Größe 2 kommt vom Eintrag *.* was auch drei Zeichen sind und die auch richtig in diesen Array eingefügt werden.



    VB.NET-Quellcode

    1. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> Public Class FILEDIR
    2. <MarshalAs(UnmanagedType.ByValArray, SizeConst:=256)> Public filename As Char() = New Char(256 - 1) {}End Class

    VB.NET-Quellcode

    1. <DllImport("D:\Users\matera\Projekte VB\Wrapper\DnccInitWrap\DnccInitWrap\release\dncc_api_pc.dll", CharSet:=CharSet.Ansi)> Private Shared Function dncc_OpenDir(ByVal hdl As Integer, <[In]()> ByVal filename As FILEDIR, ByVal mode As Integer) As IntegerEnd Function

    VB.NET-Quellcode

    1. Private Sub Button_Read_file_list_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Read_file_list.Click
    2. Dim Foulder As String
    3. Dim mode As Integer
    4. Dim Nr_of_input As Integer
    5. Dim pointer_to_Array As New DIRINF
    6. Dim array_of_filename As String
    7. Dim fdir As New FILEDIR
    8. Dim i As IntegerIf status(nDNCC_HANDLE) = 4 Then
    9. nResult = dncc_Connect(nDNCC_HANDLE)Thread.Sleep(50)
    10. Foulder = TextBox_Directory.Text
    11. mode = 0
    12. fdir.filename = TextBox_Directory.Text
    13. 'fdir.count = 0
    14. 'fdir.Start = 1
    15. nResult = dncc_OpenDir(nDNCC_HANDLE, fdir, mode)Thread.Sleep(250)
    16. ii = 0
    17. If nResult = 0 Then
    18. Do
    19. Nr_of_input = dncc_ReadDir(nDNCC_HANDLE, pointer_to_Array)
    20. array_of_filename = pointer_to_Array.filename
    21. ii = ii + 1Thread.Sleep(50)
    22. Loop While Nr_of_input <> 0Else MessageBox.Show("Failer open foulder", "failure")
    23. nResult = dncc_Disconnect(nDNCC_HANDLE)
    24. Thread.Sleep(250)
    25. End If
    26. nResult = dncc_CloseDir(nDNCC_HANDLE)
    27. nResult = dncc_Disconnect(nDNCC_HANDLE)Thread.Sleep(250)
    28. ElseMessageBox.Show("NC is not in Automatic mode", "Failure")
    29. End If End Sub

    Hast Du die DLL-Quellen in der Hand?
    Dann mach die Übergabe anders.
    Pack das gesamte Feld in einen IntPtr und übergib als weiteren Parameter die Länge des Feldes.
    Damit solltest Du keine Probleme haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Antwort, hat gut geklappt :thumbsup:.

    Das nächste Problem auf einen steinigen Pfad ist beiseite gerollt danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „matzemaschine“ ()