none
Errore di conversione implicita RRS feed

  • Domanda

  • Ciao a Tutti,

    Utilizzo una funzione che scrive un array di short all'interno di una struttura(definita in una dll in c#) utilizzando: Runtime.InteropServices.Marshal.PtrToStructure

    Statement di definizione: Option Strict On

    La struttura: DMCP_STRUBACKUP.DM_FlashImpianto(0).Sensori ha questa definizione: Mylos_Free_DLL.FLASH_IMPIANTO_STRUCT.<Sensori>e__FixedBuffer8

    Sulla chiamata: Runtime.InteropServices.Marshal.PtrToStructure(....) si manifesta l'errore

    Se metto lo statement: Option Strict Off, funziona senza errori, ma non vorrei cambiare lo statement.

    Come fare il cast?

    Grazie

    Roberto

    Codice:

    Dim oSensori As Short() = {0,2,1,0}
    Prova1(oSensori)

    Public Sub Prova1(ByVal oSensori As Short())
        Dim MyGC As Runtime.InteropServices.GCHandle = Nothing
        Try
          MyGC = Runtime.InteropServices.GCHandle.Alloc(oSensori, Runtime.InteropServices.GCHandleType.Pinned)
          DMCP_STRUBACKUP.DM_FlashImpianto(0).Sensori = Runtime.InteropServices.Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, DMCP_STRUBACKUP.DM_FlashImpianto(0).Sensori.GetType)
          '=======================================================================================
          MyGC.Free()
          '=======================================================================================
        Catch ex As Exception
          If Not MyGC = Nothing Then MyGC.Free()
        End Try

      End Sub

    martedì 23 agosto 2016 22:26

Risposte

Tutte le risposte

  • Ciao 12345_BOB,

    potresti provare con un

    TryCast Operator (Visual Basic)

    Ciao


    Renato Marzaro

    Microsoft MVP .NET

    http://community.visual-basic.it/renato

    mercoledì 24 agosto 2016 06:57
    Moderatore
  • Ciao Renato,

    già provato, o meglio li ho provati tutti i cast.

    anche se ho delle difficoltà ad eseguire un cast a: Mylos_Free_DLL.FLASH_IMPIANTO_STRUCT.<Sensori>e__FixedBuffer8 ( .<Sensori>e....   sintax error)

    Posso risolvere con la modifica della condizione di "Conversione implicita" nelle proprietà del progetto, cambiando la segnalazione da ERRORE a NESSUNO, e mantenendo Option Strict che diventa  (personalizzato)

    Mi sarebbe piaciuto, però, risolvere in un modo meno "drastico"

    Ciao

    Roberto

    mercoledì 24 agosto 2016 08:59
  • Ciao 12345_BOB,

    hai disponibile definizione dalla parte c# della DLL ?

    Ciao


    Renato Marzaro

    Microsoft MVP .NET

    http://community.visual-basic.it/renato

    mercoledì 24 agosto 2016 09:05
    Moderatore
  • Ciao Renato,

    eccola, è solo una parte in quanto è molto grande, ma compare l'assegnamento: public fixed ushort Sensori[4];

    Roberto

     [Serializable]
        [StructLayout(LayoutKind.Sequential, Pack=1)]
        unsafe public struct FLASH_IMPIANTO_STRUCT:ISerializable
        {
       public byte        Regolazione;

       public fixed uint XTEA_HI_KEY1[2]; /*!< Parte Alta della chiave a 128 bit */
       public fixed uint XTEA_HI_KEY0[2]; /*!< Parte Alta della chiave a 128 bit */

       public fixed ushort Sensori[4]; /*!< 256 bit di presenza - assenza dispositivi */

       public ushort    Tastiere; /*!< 16 bit di presenza - assenza tastiere. */

    mercoledì 24 agosto 2016 13:04
  • Ciao 12345_BOB,

    vedo che il tipo dati della struttura è uShort mentre il tuo array è Short come mai ?

    Ciao


    Renato Marzaro

    Microsoft MVP .NET

    http://community.visual-basic.it/renato

    mercoledì 24 agosto 2016 14:07
    Moderatore
  • Ciao Renato,

    ho visto, ma dato che il retBuff di short viene estratto tramite le solite funzioni di marshal, vedi esempio

          retBuff = New Short(Length - 1) {}
          Runtime.InteropServices.Marshal.StructureToPtr(Obj, MyGC.AddrOfPinnedObject, False)
          Runtime.InteropServices.Marshal.Copy(MyGC.AddrOfPinnedObject, retBuff, 0, Length)

    la: Runtime.InteropServices.Marshal.Copy non ha nessun overload con parametro USHORT.

    ma il problema sta nel fatto che non riesce ad eseguire il cast da (C# fixed ushort) con lo statement Strict ON

    di seguito il codice di estrazione e riassegnamento.

    Public Function StructureTo_ShortArray(ByVal Obj As Object) As Short()
        Dim retBuff() As Short = {}
        Dim MyGC As Runtime.InteropServices.GCHandle = Nothing
        Try
          Dim Length As Integer = CInt(Runtime.InteropServices.Marshal.SizeOf(Obj))
          MyGC = Runtime.InteropServices.GCHandle.Alloc(Obj, Runtime.InteropServices.GCHandleType.Pinned)
          retBuff = New Short(Length - 1) {}
          Runtime.InteropServices.Marshal.StructureToPtr(Obj, MyGC.AddrOfPinnedObject, False)
          Runtime.InteropServices.Marshal.Copy(MyGC.AddrOfPinnedObject, retBuff, 0, Length)
          '=======================================================================================
          MyGC.Free()
          '=======================================================================================
        Catch ex As Exception
          If Not MyGC = Nothing Then MyGC.Free()
        End Try

        Return retBuff
      End Function

    Public Sub ShortArrayTo_Structure(ByRef Obj As Object, ByVal bBuff() As Short)
        Dim MyGC As Runtime.InteropServices.GCHandle = Nothing
        Try
          'Get array address and copy it to structure
          MyGC = Runtime.InteropServices.GCHandle.Alloc(bBuff, Runtime.InteropServices.GCHandleType.Pinned)
          'This will copy short array to Obj Structure
          Obj = Runtime.InteropServices.Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, Obj.GetType)
          '=======================================================================================
          '=======================================================================================
          MyGC.Free()
          '=======================================================================================
          'Catch ex As Exception
        Catch ex As ArgumentException
          MsgBox(ex.Message)

          If Not MyGC = Nothing Then MyGC.Free()
        End Try
      End Sub

    Codice che esegue le chiamate:

    Dim oSensoriSuZona As Short() = {}

    'Lettura array short da struttura, la struttura viene passata per valore

    oSensoriSuZona = StructureTo_ShortArray(DMCP_STRUBACKUP.DM_FlashImpianto(0).Sensori)

    'operazioni svolte sull'array oSensoriSuZona

    oSensoriSuZona(0)=5

    'Riscrittura array short su struttura, la struttura viene passata per referenza

    ShortArrayTo_Structure(DMCP_STRUBACKUP.DM_FlashImpianto(0).Sensori, oSensoriSuZona)

    Ciao Roberto

    giovedì 25 agosto 2016 07:14
  • Ciao 12345_BOB,

    purtroppo non mi viene nessuna buona idea :(

    L'unica, anche se non è una grande idea, è quella di mettere il codice in una Partial Class dove posso disattivare temporaneamente Option Strict

    Ciao


    Renato Marzaro

    Microsoft MVP .NET

    http://community.visual-basic.it/renato

    giovedì 25 agosto 2016 08:14
    Moderatore
  • Ciao Renato,

    non ho idea su come fare.

    se io definisco una Partial Class nella quale implemento le mie funzioni di conversione, come faccio a disabilitare temporaneamente Option Strict.

    se non ricordo male, l'opzione è a livello di file (modulo) tant'è che deve essere definita prima degli imports.

    ci sono delle clausole-definizioni che si possono utilizzare all'interno della classe?

    se si quali?

    Roberto

    ciao

    giovedì 25 agosto 2016 09:01
  • Ciao Roberto,

    ti basta creare la tua Partial Class in un file separato dove andrai a specificare Option Strict OFF

    Ciao


    Renato Marzaro

    Microsoft MVP .NET

    http://community.visual-basic.it/renato

    • Contrassegnato come risposta 12345_BOB giovedì 25 agosto 2016 11:28
    giovedì 25 agosto 2016 09:25
    Moderatore
  • Ciao Renato,

    Grazie per la pazienza.

    Roberto

    giovedì 25 agosto 2016 11:28
  • Ciao Renato,

    Grazie per la pazienza.

    Roberto

    Ciao Roberto,

    nessuna pazienza ;) è un piacere!

    Ciao


    Renato Marzaro

    Microsoft MVP .NET

    http://community.visual-basic.it/renato

    giovedì 25 agosto 2016 11:34
    Moderatore