Je viens d'être chargé de mettre à niveau une application web d'entreprise interne. L'utilisateur saisit des données, l'application web compile ensuite un EXE winforms personnalisé (type d'application auto-extracteur/installateur), puis le site web le met à disposition en téléchargement.
Nous avons récemment appris que ce programme d'installation compilé de manière personnalisée affiche une erreur/un avertissement de compatibilité dans Windows 7. Après quelques recherches, j'ai appris que je devais fournir un manifeste d'application qui spécifie la compatibilité avec Windows 7 :
Liens connexes :
- Article de Stackoverflow détaillant l'erreur de compatibilité avec Windows 7
- Article MSDN qui détaille ce qui est requis dans le Manifeste d'application
- Exemple de code qui montre comment définir les options du compilateur.
C'est ma première expérience avec du code personnalisé/compilé dynamiquement, et des manifestes d'application.
Comme cette application est compilée à la volée (à partir d'un seul fichier de code et de quelques ressources intégrées), je ne peux pas simplement ajouter un manifeste à mon projet. J'ai donc utilisé l'option "/win32manifest" du compilateur pour référencer le fichier manifeste lors de la compilation.
Voici un bout de code de la classe personnalisée "Archive Compiler" qui effectue la compilation : (je n'ai ajouté que la partie "Application Manifest").
public void CompileArchive(string archiveFilename, bool run1stItem, string iconFilename)
{
CodeDomProvider csc = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = true;
cp.OutputAssembly = archiveFilename;
cp.CompilerOptions = "/target:winexe";
// Custom option to run a file after extraction
if (run1stItem) {
cp.CompilerOptions += " /define:RUN_1ST_ITEM";
}
if (!string.IsNullOrEmpty(iconFilename)) {
cp.CompilerOptions += " /win32icon:" + iconFilename;
}
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");
// Add application manifest to specify operating system compatibility (to fix compatibility warning in Windows 7)
string AppManifestPath = Path.Combine( System.Web.HttpContext.Current.Server.MapPath( "~/Content/" ), "CustomInstaller.exe.manifest" );
if ( File.Exists( AppManifestPath ) ) {
cp.CompilerOptions += string.Format( " /win32manifest: \"{0}\"", AppManifestPath );
}
// Add compressed files as resource
cp.EmbeddedResources.AddRange(filenames.ToArray());
// Compile standalone executable with input files embedded as resource
CompilerResults cr = csc.CompileAssemblyFromFile(cp, sourceCodeFilePath);
// yell if compilation error
if (cr.Errors.Count > 0) {
string msg = "Errors building " + cr.PathToAssembly;
foreach (CompilerError ce in cr.Errors) { msg += Environment.NewLine + ce.ToString(); }
throw new ApplicationException(msg);
}
}
Cependant, lorsque je compile, je continue à rencontrer cette erreur :
Bâtiment des erreurs D:\Projects\MySolution\WebAppName\App_Data\MyUsername\CustomInstaller.exe erreur CS2007 : Option non reconnue : '/win32manifest:'.
J'ai du mal à trouver des informations à ce sujet, à part des articles qui indiquent que ce paramètre existe et est valide. L'application web est dans visual studio 2010 et fonctionne sur framework 2.0. L'application compilée dynamiquement fait également référence à .net 2.0 (vérifié avec un décompilateur). Je ne sais pas quel EXE est appelé pour effectuer la compilation, ou ce que je pourrais vérifier d'autre pour résoudre ce problème. Toute aide serait appréciée.