我只是负责升级内部企业 Web 应用程序。用户输入一些数据,然后网络应用程序编译一个自定义的 winforms EXE(应用程序的自解压器/安装程序类型),然后网站将其作为下载提供。
我们最近了解到这个自定义编译的安装程序在 Windows 7 中显示兼容性错误/警告。经过一些研究后,我了解到我需要提供一个应用程序清单来指定与 Windows 7 的兼容性:
相关链接:
这是我对自定义/动态编译代码和应用程序清单的第一次体验。
由于这个应用程序是动态编译的(从单个代码文件和一些嵌入式资源),我不能只向我的项目添加清单。所以我在编译时使用了编译器的“/win32manifest”编译器选项来引用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);
}
}
但是,当我编译时,我一直遇到这个错误:
错误构建 D:\Projects\MySolution\WebAppName\App_Data\MyUsername\CustomInstaller.exe 错误 CS2007: Unrecognized option: '/win32manifest:'
除了声明此参数存在且有效的文章之外,我无法找到有关此的信息。Web 应用程序位于 Visual Studio 2010 中,并在框架 2.0 上运行。动态编译的应用程序也引用了 .net 2.0(使用反编译器验证)。我不确定调用什么 EXE 来执行编译,或者我可以检查什么来解决这个问题。任何帮助,将不胜感激。