vendredi 25 juin 2010

Impossible d'installer ou d'exécuter l'application. Cette application requiert l'assembly EnvDTE version 8.0.xx, qui doit d'abord être installée dans le Global Assembly Cache.

J’ai travaillé sur une application WINFORMS qui utilise EnvDTE version 7.0.xx pour l’automation de Visual Studio. L’application a été développée sur .NET 1.1 avec Visual Studio 2003.

Récemment, j’ai fait la migration de cette application vers le framework .NET 3.5 avec Visual Studio 2008.

J’ai déployé l’application via  ClickOnce Deployment.

Lorsque je l’ai installée sur ma machine, cela marche sans problème. Par contre, lorsque je l’ai installée sur une machine où il n’y a pas de Visual Studio .NET installé, j’ai obtenu une erreur suivante :
Impossible d'installer ou d'exécuter l'application. Cette application requiert l'assembly EnvDTE version 8.0.xx, qui doit d'abord être installée dans le Global Assembly Cache.

J’ai ensuite changé toutes les références d’EnvDTE 7.0.xx dans mon application par EnvDTE version 8.0.xx.

J’ai réessayé de l’installer la machine où il n’y a pas de Visual Studio .NET installé.

Mais, cette fois-ci j’ai obtenu l’erreur suivante:
Impossible d'installer ou d'exécuter l'application. Cette application requiert l'assembly EnvDTE version 7.0.xx, qui doit d'abord être installée dans le Global Assembly Cache.


J’ai essayé de trouver la réponse à ce problème. Apres plusieurs recherches, j’ai trouvé un article sur MSDN qui m’a aidé à résoudre ce problème.
“Cette erreur est liée à un conflit de résolution de type à l'exécution. En d'autres termes, la version de EnvDTE incluse dans Visual Studio 2005 est 8.0.xx, mais la référence de configuration du projet recherche une version antérieure de cet assembly ; la version 7.0.xx. Pour corriger ce problème, vous devez ajouter une redirection de liaison pour la version la plus récente de EnvDTE au fichier de configuration (.config) de votre projet. Ainsi, Visual Studio pourra charger la version la plus récente de EnvDTE et empêcher l'erreur de se produire."


J’ai ajouté dans mon fichier App.config à l’intérieure de la section « runtime », la configuration suivante :
Je peux maintenant déployer l’application avec succès.

Pour lire plus loin:
http://msdn.microsoft.com/fr-fr/library/4eeya3de(VS.80).aspx

vendredi 18 juin 2010

[SQL Server] Erreur de restauration de base de données

Lors de restauration d’une base de données, j’ai rencontré un message d’erreur :

System.Data.SqlClient.SqlError: Le support de sauvegarde est formé de 2 familles de supports, mais seules 1 sont fournies. Tous les membres doivent être fournis. (Microsoft.SqlServer.Smo)

Cette erreur est due à la sauvegarde dans deux emplacements et qu’on ne reprend qu’un emplacement pour la restauration.

Pour corriger cette erreur, j’ai du refaire le sauvegarde et la restauration de la base de données.
1. Sélectionner la base de données
2. Cliquer sur Sauvegarder
3. Supprimer tous les emplacements listés
4. Sélectionner un nouvel emplacement
5. A partir du fichier généré, restaurer la base

mardi 15 juin 2010

Word ne peut pas démarrer le convertisseur mswrd632.wpc

J'ai travaillé avec Interop.Word pour générer les documents Word via une application Winforms.
J'ai récemment fait la migration de la version Office 2003 vers 2007.


Lorsque j'ai ouvert le document généré avec Word 2007, j'ai obtenu l'erreur:
Word ne peut pas démarrer le convertisseur mswrd632.wpc

Après des recherches, cette erreur est due à la mise à jour de sécurité Windows XP, Windows 2000, and Windows Server 2003 au 8 Décembre 2009.


Pour éviter l'affichage de ce message, j'ai supprimé le convertisseur mswrd632 en base de registre. Pour ce faire:
-Exécuter regedit
-Aller dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Text Converters\Import\MSWord6.wpc
-Cliquer droit puis supprimer

Cela désinscrit le convertisseur indiqué dans le message d’erreur. Microsoft Office utilisera ses propres convertisseurs pour ouvrir les documents.

Pour plus d'explication:
-http://support.microsoft.com/kb/973904
-http://support.microsoft.com/kb/243088

vendredi 11 juin 2010

L'identité actuelle ([machine]/ASPNET) ne dispose pas d'un accès en écriture à 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.

Lors d'une migration du Framework .NET1.1 vers .NET3.5, lorsque je lance une application web, j'ai obtenu un message suivant sur le navigateur:
L'identité actuelle ([machine]/ASPNET) ne dispose pas d'un accès en écriture à 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.

La solution la plus facile est d’ajouter à l’utilisateur ASPNET des droits en lecture sur le dossier C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727.

Sinon, lancer aspnet_regiis.exe depuis le dossier C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727. Cette commande permet de mapper l'application à la version ISAPI ASP.NET du Framework 2.0 et exécuter d'autres opérations de configuration.

Les options pour cette commande sont disponibles sur:
http://msdn.microsoft.com/fr-fr/library/k6h9cz8h(VS.80).aspx

jeudi 10 juin 2010

Cyrstal Report "ApplyLogOnInfo" très lent

J'ai migré une application qui utilise Crystal Report qui génère un fichier PDF avec les données de la base SQL Server.

La migration se fait à partir du .NET 1.1 vers .NET3.5.
Depuis la génération du pdf est très lente.
La partie qui est particulièrement lente se trouve dans la boucle:
TableLogOnInfo logOnInfo = new TableLogOnInfo();
for (int i = 0; i < dossierCyrstal.Database.Tables.Count; i++)
{
      //logOnInfo
      logOnInfo.ConnectionInfo.ServerName = [Nom du serveur];
      logOnInfo.ConnectionInfo.DatabaseName = [Nom base de données];
      logOnInfo.ConnectionInfo.UserID = [Nom d'utilisateur];
      logOnInfo.ConnectionInfo.Password = [Mot de passe];
     dossierCrystal.Database.Tables[i].ApplyLogOnInfo(logOnInfo);
}
Après les recherches sur le net, j'ai remplacé la boucle ci-dessous avec deux lignes de code:
      dossierCrystal.DataSourceConnections[0].SetConnection
     ([Nom du serveur], [Nom base de données], [Nom d'utilisateur], [Mot de passe]);
      dossierCrystal.Refresh();

Depuis, la génération s'accélère.

mardi 8 juin 2010

Interopérabilité Word 2007 Un composant externe a levé une exception

J’ai travaillé sur une application Winforms développée en C# qui génère des documents Word.
La génération consiste à remplacer les mots clés dans le document par les données de la base de données.

Sur certains postes d'utilisateur, la génération renvoie une exception:
"Composant externe a levé une exception" ou "Le relais a reçu des données incorrectes"

Après plusieurs recherches, c'est lors d'appel de l'objet Find qui pose problème.
Ceci est dû à l'enregistrement des bibliothèques antérieures à 2007 qui sont enregistrées dans la base de registre Windows après celles de 2007.

Deux solutions possibles:
1. Exécuter la ligne de commande: C:\Program Files\Microsoft Office\Office12\Winword.exe /r qui force la réinscription des dll Word dans la base de registre Windows.
Ou s'il n'y a qu'une seule version Word sur le poste, aller dans Démarrer -> Exécuter -> winword.exe /r

2. Utilisez liaison tardive pour l'objet Find (late binding).
J'ai transformé le code suivant:
object missingValue = Type.Missing;
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; Microsoft.Office.Interop.Word.Find find = ThisApplication.Selection.Range.Find;
object texteRecherche = TextRecherche;
object texteRemplace = TextNew;
find.Execute(ref texteRecherche ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref texteRemplace,
ref replaceAll, ref missingValue, ref missingValue, ref missingValue, ref missingValue);
à
object missingValue = Type.Missing;
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; Microsoft.Office.Interop.Word.Find find = ThisApplication.Selection.Range.Find;
object texteRecherche = TextRecherche;
object texteRemplace = TextNew;
object[] Parameters;
Parameters = new object[15];
Parameters[0] = texteRecherche
Parameters[1] = missingValue;
Parameters[2] = missingValue;
Parameters[3] = missingValue;
Parameters[4] = missingValue;
Parameters[5] = missingValue;
Parameters[6] = missingValue;
Parameters[7] = missingValue;
Parameters[8] = missingValue;
Parameters[9] = texteRemplace
Parameters[10] = replaceAll;
Parameters[11] = missingValue;
Parameters[12] = missingValue;
Parameters[13] = missingValue;
Parameters[14] = missingValue;
find.GetType().InvokeMember("Execute", System.Reflection.BindingFlags.InvokeMethod, null, find,Parameters);
// Libérer les ressources
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFind);
oFind = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(oSelection);
oSelection = null;

Le problème a été résolu.

NB: Bien que la première méthode est plus facile, l'application peut échouer par la suite, si la bibliothèque de type Excel 95,… est réinscrite par une autre application ou un service pack.

Pour aller plus loin:
http://support.microsoft.com/kb/313104
http://support.microsoft.com/kb/210565