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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?