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
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 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
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
et le code de la méthode ExtModele.InitCode:
1
2
3
4
5
6
7
8
9 public ExtModele Modele() { ExtModele pModele = new ExtModele(); pModele.Init(_swSW.ActiveDoc(), this); return pModele; }
Ç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 ?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; }
Une idée pour m'aider svp ?