passage de valeurs C# (Com) => ASP

Résolu
cs_leromantique6 Messages postés 29 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 27 août 2007 - 9 août 2007 à 20:31
cs_leromantique6 Messages postés 29 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 27 août 2007 - 17 août 2007 à 10:09
bonjour!

Dslé de poster un nouveau sur un sujet qui est sensiblement identique a celui que j'ai deja posté. Mais comme le precedent a deja etait validé alors j'ai peur que celui ci ne soit pas lu, voila pour la petite histoire ...

Concretement, j'ai un pti problemen sur le passage de parametre (tableau de int) de c# vers asp .
Mm en utilisant MarshallAs safearray, rien n'y fait.
Je m'explique :
J'ai creer un composant COM .net interop dans lequel j'ai une fonction qui renvoit un tableau de int assez conséquent.

Pour ce faire j'ai fait un petit test :

interface testInterface{

[return: MarshalAs(UnnmanagedType.saffeArray)]
int[] getTest();
}
public class testImpl : testInterface{
public int[] getTest(){
int[] tab = new int[]{1,2,3,4,5,6,7,89,0};
return tab;
}
}

Donc Si j'appelle cet objet a partir d'une page asp, comme ceci :

... creation de l'objet (server.createobject ...)
tableau = t.getTest()

Lorsque je fais typename(tableau), ca marche, ca reponds : Long().
Quand je fais ubound(tableau) +1 =>10.
Par contre quand je fais : tableau(1), ca marche plus !!! Erreur : Type incompatible ....

Voila, et la j'ai beau chercher des info sur le net ca marche pas trop ..
Votre aide serez la bienvenue

Merci

6 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
16 août 2007 à 23:11
salut,

le prb vient du fait que le moteur VBScript ne sait pas gérer les tableaux typés... par contre il sait très bien gérer les tableaux de variant et les variant simples...

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace TestCOM
{
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface testInterface
    {
        [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
        object[] getTest();
    }

    [ClassInterface(ClassInterfaceType.None)]
    public class testImpl : testInterface
    {
        [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
        object[] testInterface.getTest()
        {
            object[] tab = new object[] { 1, 2, 3, 4, 5, 6, 7, 8,9, 0 };
            return tab;
        }
    }
}

ShareVB
3
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
12 août 2007 à 23:45
salut,

déjà essaie de mettre le [return ...] sur la méthode de la classe et pas de l'interface...

ensuite, essaie de mettre un param ref au lieu de renvoyer le tableau

enfin, essaie de définir dans le constructeur de l'attribut : SafeArraySubType=typeof(int)

ShareVB
0
cs_leromantique6 Messages postés 29 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 27 août 2007
15 août 2007 à 18:49
Merci pour ta reponse!
Mais malheureusement ca marche toujours pas...
Je cherche toujours ..
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
15 août 2007 à 20:40
salut,

voici ce que j'ai fait :
-> dans un projet avec register for com interop et make com visible :
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace TestCOM
{
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface testInterface
    {
        [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_INT)]
        int[] getTest();
    }

    [ClassInterface(ClassInterfaceType.None)]
    public class testImpl : testInterface
    {
        [return: MarshalAs(UnmanagedType.SafeArray,SafeArraySubType=VarEnum.VT_INT)]
        int[] testInterface.getTest()
        {
            int[] tab = new int[] { 1, 2, 3, 4, 5, 6, 7, 89, 0 };
            return tab;
        }
    }
}

-> dans le projet VB6 :

Private Sub Form_Load()
Dim t As New TestCOM.testImpl
Dim a() As Long
a = t.getTest()
End Sub

ShareVB
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_leromantique6 Messages postés 29 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 27 août 2007
16 août 2007 à 10:32
Bonjour,
Merci pour ta réponse ShareVB.
Est ce que ton projet VB6 fonctionne ? Notament si tu fais : a(1) ?
Moi ca me fait toujours la même erreur qu'au debut. Mais au fait j'ai peut être oublié de mentionné que je travaille a partir de ASP (plus precisement VBScript) pour acceder au fonction de mon composant COM, je sais pas si ca changes tout ...
Mais en attendant, il reconnait toujours le type de tableau (enfin j'ai du mettre SafeArray,SafeArraySubType=VarEnum.VT_I4) en Long().
Mais impossible de faire tableau (1) ou tableau (1,1)...rien ne fonctionne
0
cs_leromantique6 Messages postés 29 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 27 août 2007
17 août 2007 à 10:09
Aaah je suis bien content, ca marche ! Je te remercie bp ShareVB pour ton aide, qui fut si précieuse.
0
Rejoignez-nous