robertosalemi Inserito: 3 dicembre 2019 Segnala Share Inserito: 3 dicembre 2019 Buongiorno a tutti, sto aggiornando un vecchia applicazione sviluppata in VB6 nella quale sto integrando delle chiamate ad una dll sviluppata in .net. Ho un array di tipi Variant Dim myArray() As Variant ho necessità di convertire il tipo da Variant ad Object (la funzione che devo chiamare dalla DLL integrata accetta in ingresso solo un array di object). Come procedere? Grazie. Link al commento Condividi su altri siti More sharing options...
lucios Inserita: 5 dicembre 2019 Segnala Share Inserita: 5 dicembre 2019 Sono un po' arrugginito con VB6, comunque prova a dare un'occhiata qui Link al commento Condividi su altri siti More sharing options...
GiRock Inserita: 7 dicembre 2019 Segnala Share Inserita: 7 dicembre 2019 Allora, ho fatto un po' di prove prima di sconfiggere l'incompatibilità dei dati tra VB6 e CSharp, alla fine ho capito che passando l'Array di Variant con la funzione Array(varr()) C# li accetta senza lamentarsi, inoltre ho anche letto parecchie richieste di questo tipo senza che nessuno abbia suggerito qualcosa di utile a riguardo, quindi fanne tesoro... Comunque non hai detto se hai già l'interfaccia COM per comunicare tra VB6 e C#, non sperare di chiamare le DLL come se fossero delle comuni API, al limite puoi usare quelle che compaiono nelle Referenze del Progetto in VB6, fai sapere qualcosa di più specifico... Link al commento Condividi su altri siti More sharing options...
GiRock Inserita: 14 dicembre 2019 Segnala Share Inserita: 14 dicembre 2019 (modificato) Devo Specificare che VB6 crea oggetti del tipo System.__ComObject, mentre in C# sono del tipo System.Object, quindi anche passandogli l'Array di oggetti (a patto di riuscire a convertirli), l'Errore è assicurato... Questo è il codice che ho usato in C#; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; namespace ClassLibraryName { public class ClassName { public object[] TestVariantToObject(object[] param) { int i = 0; object[] o = new object[param.Length]; for (i = 0; i < param.Length; i++) { o[i] = param[i]; } return o.ToArray(); } } } Questo è il codice che ho usato in VB6; Option Explicit Dim WithEvents CSharpInteropServiceEvents As CSharpInteropService.LibraryInvoke Private Sub CSharpInteropServiceEvents_MessageEvent(ByVal message As String) Debug.Print message End Sub Private Sub mnu_TestVariantToObject_Click() Dim ret As Variant Dim v(10) As Variant Dim i As Integer v(0) = CDbl(1.25846582454) v(1) = "Pippo" Set v(2) = Icon v(3) = CSng(3.14) v(4) = CDate(Now) v(5) = CLng(546827957) v(6) = CCur(1000000000) v(7) = CInt(999) v(8) = CByte(1) Set v(9) = Form1 Set v(10) = Form1.Font Dim load As New LibraryInvoke Set CSharpInteropServiceEvents = load ' For Debug Events ' Call .NET C# Function by GenericInvoke Intrerface: ' ' GenericInvoke(LIB_PATH_TO_LOAD, CLASS_LIBRARY.CLASS_NAME, FUNCTION_NAME, PARAM()) ' ret = load.GenericInvoke(App.Path + "\..\ClassLibrary\bin\Debug\ClassLibrary.dll", "ClassLibraryName.ClassName", "TestVariantToObject", Array(v())) For i = LBound(ret) To UBound(ret) If Not IsObject(ret(i)) Then Debug.Print ret(i) Else Debug.Print TypeName(ret(i)) End If Next i End Sub Questo è il risultato di ritorno dalla funzione C# come Array() di Variant; 1,25846582454 Double Pippo String Type: 3 Picture 3,14 Single 10/12/2019 14:30:32 Date 546827957 Long 1000000000 Decimal 999 Integer 1 Byte Type: 9 MDIForm1 Type: 8 Font Modificato: 14 dicembre 2019 da GiRock Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora