Erreur de l'assembly 'Microsoft.VisualBasic.Compatibility.Data'

Résolu
Thomas13012 Messages postés 35 Date d'inscription samedi 12 septembre 2015 Statut Membre Dernière intervention 8 octobre 2016 - 16 déc. 2015 à 21:02
Thomas13012 Messages postés 35 Date d'inscription samedi 12 septembre 2015 Statut Membre Dernière intervention 8 octobre 2016 - 19 déc. 2015 à 20:08
Bonsoir,

En démarrant mon appli j'obtiens les 2 erreurs suivantes :

- Impossible d'incorporer les types interop à partir de l'assembly 'Microsoft.VisualBasic.Compatibility.Data', car l'attribut 'Guid' est manquant.

- Impossible d'incorporer les types interop à partir de l'assembly 'Microsoft.VisualBasic.Compatibility.Data', car l'attribut 'ImportedFromTypeLib' ou 'PrimaryInteropAssembly' est manquant.

Je ne sais pas comment régler ces problèmes d'attribut. Quelqu'un pourrait-il m'aider ?

D'avance, merci.

Thomas

6 réponses

Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
16 déc. 2015 à 21:07
Bonsoir,

tout d'abord es tu bien sûr d'avoir besoin de composants VB6 dans une appli VB.Net?

A lire
http://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net

Si oui, même si normalement non, dans tes références as tu bien la bonne dll, à jour?
0
Thomas13012 Messages postés 35 Date d'inscription samedi 12 septembre 2015 Statut Membre Dernière intervention 8 octobre 2016 1
17 déc. 2015 à 15:33
Merci pour ta réponse. Elle m'a mis sur une piste.
Il s'agit de convertir du code VB6 en VB.Net, et j'ai probablement un conflit de dll dans mes références.
J'essaye de voir ça ce soir, et je reviens pour le résultat.
0
Thomas13012 Messages postés 35 Date d'inscription samedi 12 septembre 2015 Statut Membre Dernière intervention 8 octobre 2016 1
17 déc. 2015 à 19:32
Voilà, j'ai pu supprimer la référence 'Microsoft.VisualBasic.Compatibility.Data', et mes 2 erreurs ont disparu. Mais j'obtiens désormais une exception me mettant en garde d'une division par zéro.
Voici mon code tout simple me permettant de récupérer la valeur d'une rubrique d'un fichier ini :

Declare Function GetPrivateProfileStringByKeyName& Lib "kernel32" Alias "GetPrivateProfileStringA" (ByRef lpApplicationName$, ByRef lpszKey$, ByRef lpszDefault$, _
ByRef lpszReturnBuffer$, ByRef cchReturnBuffer&, ByRef lpszFile$)

Function VBGetPrivateProfileString(Section$, Key$, File$) As String

'====================================================================
'Récupère la chaine d'une rubrique ou clé
'd'une section donné d'un fichier *.Ini donné
'section$ : Section.
'key$ : Clé ou rubrique.
'File$ : Finchier *.INI.
'====================================================================

Dim KeyValue$
Di aviosm characters As Long

KeyValue$ = StrDup(128, Chr(0))

characters = GetPrivateProfileStringByKeyName(Section$, Key$, "", KeyValue$, 127, File$)

KeyValue$ = Microsoft.VisualBasic.Left(KeyValue$, CInt(characters))

VBGetPrivateProfileString = KeyValue$

End Function


Merci d'avance pour votre votre avis concernant cette procédure.

Thomas
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
17 déc. 2015 à 20:36
Bonsoir,

Il est de bon ton de ne parler que d'un problème par sujet, ça évite de ne plus savoir de quoi on parle. C'est d'ailleurs inscrit sur la charte http://codes-sources.commentcamarche.net/contents/11-charte-de-commentcamarche-net-conseils-d-ecriture
  • je ne voies pas ou il peut y avoir une division par zéro dans ce code.
  • StrDup ça n'est pas du VB.Net ou alors c'est une méthode que tu as écrite, auquel cas tu n'as pas mis le code.
  • Microsoft.VisualBasic.Left n'est pas non plus du VB.Net, d'ailleurs tu es obligé d'appeler Microsoft.VisualBasic pour l'utiliser.
  • Je ne voies pas l'intérêt d'aller importer kernel32 pour lire un fichier INI, qui n'est ni plus ni moins qu'un fichier texte. Si tu mets un exemple (sans données sensible) de ton fichier ini, je pourrais te proposer une ou deux options
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
Modifié par ucfoutu le 17/12/2015 à 23:04
Il semble que c'est l'équivalent de la fonction String de VB6 :
https://msdn.microsoft.com/fr-fr/library/w37th3kf%28v=vs.90%29.aspx
et que, donc :
StrDup(128, Chr(0))
retournerait une chaîne de caractères composée de 128 caractères nuls de terminaison.
De ce que je comprends, il utilise strdup pour initialiser le buffer que va utiliser la fonction GetPrivateProfileString (qu'il a "aliassée" sous GetPrivateProfileStringByKeyName) de la librairie Kernel32 de l'Api de Windows.
Si c'est bien cela, il commet une erreur, car ce buffer devrait être initialisé en une chaîne de 0 et non de caractères nuls ( chr(0) ) !
Une chaîne de chr(0) est interprétée comme de longueur nulle (le 1er caractère étant un caractère nul de terminaison)
Sa variable characters devrait retourner le nombre de caractères écrits finalement dans le buffer après application de la fonction.
Le message d'erreur qu'il reçoit est probablement un message géré par la fonction GetPrivateProfileString et non par son appli.
Je ne connais par ailleurs pas VB.Net, mais si le suffixe & employé dans la déclaration de cette fonction est un long (ce qui serait correct en VB6), c'est- une erreur fondamentale en VB.Net.
J'observe enfin qu'il n'a pas typé la fonction utilisée !

Tout le reste (inhérent à la connaissance de VB.Net) m'échappe.
Je demeure persuadé que VB.Net prévoit en effet une telle lecture sans passer par la déclaration d'une fonction de l'Api de Windows.

Voilà voilà ..
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656 > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
17 déc. 2015 à 23:35
Dans le lien que tu mets, on voie que cette fonction est là encore un import de la dll Microsoft.VisualBasic, donc à priori un reste de VB6.

Ceci est remplacé, comme Left, par la classe string.
        Dim toto As String = New String("0"c, 10)
        Dim tata As String = "Retourne la partie droite de ce texte".Substring(19)


Et c'est, de toute façon, inutile pour lire un fichier texte, puisque les 2 méthodes les plus courantes (la classe File et l'objet StreamReader) retourne des string ou des tableaux de string.

Pour parser le texte, on peut ensuite utiliser string.split, des requêtes linq, des regex, une combinaison de ces méthodes....
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
Modifié par ucfoutu le 18/12/2015 à 08:42
Oui, Whism,
J'en profite pour corriger mon :
J'observe enfin qu'il n'a pas typé la fonction utilisée !

Je n'avais pas vu qu'il l'avait typée également en long, par suffixage avec un & ===>> ce qui est une erreur de plus sous VB.Net ...
Cela fait beaucoup d'erreurs ...
Bonne nuit

EDIT : Voilà, après recherches, comment il aurait dû, sous VB.Net, initialiser (c'est-à-dire réserver en mémoire l'espace nécessaire) le buffer :
 Dim Keyvalue As StringBuilder
Keyvalue = New StringBuilder(128)

('en notant que 128 me parait un peu chiche. J'aurais personnellement réservé en mémoire au moins 200 ... de préférence 300)

J'aurais déclaré ainsi la fonction de l'Api de Windows
Private Declare Auto Function GetPrivateProfileString Lib "kernel32" (ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As StringBuilder, _
ByVal nSize As Integer, _
ByVal lpFileName As String) As Integer

Et voilà ce que deviendrait alors sa propre fonction :
Function VBGetPrivateProfileString(Section as string, Key as string, File as string) As String
Dim mon_buffer As StringBuilder
mon_buffer = New StringBuilder(128)
Dim characters As Integer
resultat = GetPrivateProfileString("Section, Key, "", mon_buffer, mon_buffer.Capacity,File)
VBGetPrivateProfileString =mon_buffer.ToString()
End Function


En supposant bien sûr que ces 3 paramètres string (Section, Key et File)

ont bien été déclarés et initialisés avant l'appel de sa fonction.

RE-EDIT : Ah oui ... et j'aurais utilisé une "signature" OP ===>>
Imports System.Runtime.InteropServices
Imports System.Text
0
Thomas13012 Messages postés 35 Date d'inscription samedi 12 septembre 2015 Statut Membre Dernière intervention 8 octobre 2016 1
18 déc. 2015 à 18:46
Merci à tous pour vos interventions.
J'avoue utiliser le typage implicite par suffixe de VB6, et VB.Net semble le tolérer (après qqs tests). J'ai le même pb avec un typage explicite, en remplissant le buffer par des "0" (en VB6 la fonction string(128, 0) - dans mon contexte 128 est largement suffisant - remplissait le buffer de caractères "nul" et tout marchait bien), et en utilisant le type StringBuilder.
En fait, le problème vient du retour de la fonction GetPrivateProfileStringByKeyName qui renvoie un long très important au lieu de 3 (dans mon cas : chaine de caractère "OUI" issue de la clé d'un fichier ini). Et la fonction CInt(characters) ne fonctionne plus dans ce cas-là (débordement de mémoire comme une division par zéro).
Bon, je crois que je vais seulement utiliser les classes de VB.Net pour lire un fichier ini, plutôt que de me contenter de conserver le code VB6 quand la compatibilité me le permettait. Mais mon code est très long, et j'espérais en conserver une bonne partie.

Encore merci pour vos contributions.

Thomas
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2015 à 19:17
J'avoue utiliser le typage implicite par suffixe de VB6, et VB.Net semble le tolérer

Certes, certes ... Mais la "digestion" d'un long (implicite par suffixe ou pas) est, elle," indigestible" ... MDR.
Le code que je t'ai montré utilise, lui, d'autres types sous VB.Net ...
0
Thomas13012 Messages postés 35 Date d'inscription samedi 12 septembre 2015 Statut Membre Dernière intervention 8 octobre 2016 1 > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
18 déc. 2015 à 19:39
J'ai essayé et j'ai le même problème à cause du retour de la fonction GetPrivateProfileStringByKeyName trop grand, et de la valeur de KeyValue$ qui passe à une chaine vide !!!... qui fait planté la fonction Left (héritage de VB6 par compatibilité) ou son équivalent Objet.Substring (fonction VB.Net).
Merci pour cette piste...
0

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

Posez votre question
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
18 déc. 2015 à 19:42
Tant que tu insisteras à mélanger les torchons et les serviettes, tu risque ce genre de problème.
0
Thomas13012 Messages postés 35 Date d'inscription samedi 12 septembre 2015 Statut Membre Dernière intervention 8 octobre 2016 1
19 déc. 2015 à 20:08
Bonsoir,

Parfois la solution du Sopalin permet d'améliorer la productivité d'un code recyclé. Mais dans ce contexte, je suis d'accord avec vous, et je vous remercie tous pour votre conseil, il était préférable de tout rebâtir. C'est ce que j'ai fait en construisant une classe disposant de collections, de fonctions string et boolean pour gérer l'essentiel des fichiers Ini. Tout marche enfin correctement.
Encore merci...

Bonnes fêtes à tous.

Thomas
0
Rejoignez-nous