Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Homme Profil pro Etienne Canuel
    Metallier
    Inscrit en
    janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Canuel
    Localisation : France

    Informations professionnelles :
    Activité : Metallier
    Secteur : Bâtiment

    Informations forums :
    Inscription : janvier 2013
    Messages : 2
    Points : 1
    Points
    1

    Par défaut C# dll 32b ou 64b

    Bonjour,

    Je suis un utilisateur de Solidworks, un logiciel de modélisation 3d dans lequel j'ai la possibilité de développer des macros en VB via Visual Basic For Application (VBA) qui fonctionne en 32b.
    Cette année, la nouvelle version de Solidworks propose Visual Studio Tools For Application à la place de Visual Basic For Application (VSTA) qui elle accepte le 32b et 64b.
    Je suis en train de développer une dll en C# avec Visual C# Express pour étendre les possibilités de mes macros.
    Pour pouvoir référencer ma DLL dans VBA ou VSTA, je coche les options "Rendre l'assembly visible par COM" et "Inscrire pour COM Interop"

    Mon problème est le suivant :
    Je compile la DLL sur mon système en 32b, je la référence dans VBA, tout fonctionne.
    Sur mon système 64b, je fais de même. La compilation se passe bien, le référencement dans VSTA aussi.
    Par contre, je n'arrive pas à renvoyer d'objet Solidworks via ma DLL.
    Je peux creer des objets SW, je peux creer des objets de ma DLL mais je ne peux pas renvoyer d'objets SW via une méthode de ma DLL.
    J'ai à chaque fois l'erreur suivante :
    Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))

    J'ai l'impression que mon pb vient des références vers mes objets crée dans ma DLL.

    Un exemple vaut mieux qu'un long discours :

    La macro VBA/VSTA qui plante
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub Main()
        'Objet de ma DLL
        Dim SldWks As ExtSldWorks
        Dim Modele As ExtModele
     
        Set SldWks = New ExtSldWorks
        SldWks.Init Application.SldWorks
        'Ici comme j'ai initialisé ma variable SldWks avec l'application,
        'je veux que ma DLL initialise et me renvoi directement un objet ExtModele
        Set Modele = SldWks.Modele
     
    End Sub
    Etrangement, cette version de ma macro fonctionne puisque ma DLL ne me retourne aucune référence d'objet crée à l’intérieur de ma DLL.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub Main()
        Dim Sw      As SldWorks.SldWorks
        'Objet de ma DLL
        Dim SldWks As ExtSldWorks
        Dim Modele As ExtModele
     
        Set Sw = Application.SldWorks
        Set SldWks = New ExtSldWorks
        SldWks.Init Application.SldWorks
        Set Modele = New ExtModele
        Modele.Init Sw.ActiveDoc, SldWks
     
    End Sub

    Voici le code C# de ma méthode ExtSldWorks.Modele
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public ExtModele Modele()
            {
                ExtModele pModele = new ExtModele();
     
                pModele.Init(_swSW.ActiveDoc(), this);
     
                return pModele;
            }
    et le code de la méthode ExtModele.Init
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public Boolean Init(ModelDoc2 ModeleDoc, ExtSldWorks Sw)
            {
     
                if (!((ModeleDoc.Equals(null)) && (Sw.Equals(null))))
                {
                    _swModele = ModeleDoc;
                    _SW = Sw;
     
                    return true;
                }
                return false;
            }
    Ça fait plusieurs jours que je me gratte les cheveux mais je n'ai pas trouvé de solutions. J'ai lu que COM fonctionne toujours en 32b, comment se passe les interactions avec les apps 64b ? Est ce à la compilation que le pb se pose ? Après quelques recherches sur le net, j'ai essayer de passer la compilation de mon projet C# de anyCPU à x86 mais sans succès ?

    Une idée pour m'aider svp ?

  2. #2
    Invité de passage
    Homme Profil pro Etienne Canuel
    Metallier
    Inscrit en
    janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Canuel
    Localisation : France

    Informations professionnelles :
    Activité : Metallier
    Secteur : Bâtiment

    Informations forums :
    Inscription : janvier 2013
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Au final, je viens de trouver. Une sombre erreur de parenthèse.

    J'ai pris une propriété pour une méthode

    J'ai écrit
    Code :
    pModele.Init(_swSW.ActiveDoc(), this);
    au lieu de
    Code :
    pModele.Init(_swSW.ActiveDoc, this);
    Ce que je n'ai pas compris, c'est que Visual Studio ne m'indiquait pas d'erreur ni en édition, ni à la compilation.

    Donc résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •