passage de valeurs C# (Com) => ASP

[Résolu]
Signaler
Messages postés
29
Date d'inscription
mardi 12 avril 2005
Statut
Membre
Dernière intervention
27 août 2007
-
Messages postés
29
Date d'inscription
mardi 12 avril 2005
Statut
Membre
Dernière intervention
27 août 2007
-
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

Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
20
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
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
20
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
Messages postés
29
Date d'inscription
mardi 12 avril 2005
Statut
Membre
Dernière intervention
27 août 2007

Merci pour ta reponse!
Mais malheureusement ca marche toujours pas...
Je cherche toujours ..
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
20
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
Messages postés
29
Date d'inscription
mardi 12 avril 2005
Statut
Membre
Dernière intervention
27 août 2007

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
Messages postés
29
Date d'inscription
mardi 12 avril 2005
Statut
Membre
Dernière intervention
27 août 2007

Aaah je suis bien content, ca marche ! Je te remercie bp ShareVB pour ton aide, qui fut si précieuse.