Erreur de l'assembly 'Microsoft.VisualBasic.Compatibility.Data' [Résolu]

Thomas13012 35 Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention - 16 déc. 2015 à 21:02 - Dernière réponse : Thomas13012 35 Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention
- 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
Afficher la suite 
35Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention

12 réponses

Répondre au sujet
Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 16 déc. 2015 à 21:07
0
Utile
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?
Commenter la réponse de Whismeril
Thomas13012 35 Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention - 17 déc. 2015 à 15:33
0
Utile
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.
Commenter la réponse de Thomas13012
Thomas13012 35 Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention - 17 déc. 2015 à 19:32
0
Utile
4
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
Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 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
ucfoutu 18021 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention > Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 17 déc. 2015 à 22:55
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à ..
Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention > ucfoutu 18021 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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....
ucfoutu 18021 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention > Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 17 déc. 2015 à 23:45
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
Commenter la réponse de Thomas13012
Thomas13012 35 Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention - 18 déc. 2015 à 18:46
0
Utile
2
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
ucfoutu 18021 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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 ...
Thomas13012 35 Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention > ucfoutu 18021 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 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...
Commenter la réponse de Thomas13012
Whismeril 10516 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 18 déc. 2015 à 19:42
0
Utile
Tant que tu insisteras à mélanger les torchons et les serviettes, tu risque ce genre de problème.
Commenter la réponse de Whismeril
Thomas13012 35 Messages postés samedi 12 septembre 2015Date d'inscription 8 octobre 2016 Dernière intervention - 19 déc. 2015 à 20:08
0
Utile
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
Commenter la réponse de Thomas13012

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.