Мне просто поручили обновить внутреннее веб-приложение предприятия. Пользователь вводит некоторые данные, а затем веб-приложение компилирует пользовательский winforms EXE (тип самораспаковывающегося/установочного приложения), а затем веб-сайт обслуживает его как загрузку.Невозможно включить манифест в мое динамически скомпилированное приложение C#
Недавно мы узнали, этот обычай скомпилированные установки отображает ошибку совместимости/предупреждение в Windows 7. После некоторых исследований я узнал, что мне нужно будет предоставить манифест приложения, который определяет совместимость с Windows 7:
Ссылки по теме:
- Stackoverflow article detailing the Windows 7 compatibility error
- MSDN Article which details what is required in the Application Manifest
- Sample code which shows how to set the compiler options
Это мой первый опыт использования пользовательского/динамически скомпилированного кода и проявлений приложений.
Поскольку это приложение скомпилировано «на лету» (из одного файла кода и некоторых встроенных ресурсов), я не могу просто добавить манифест в свой проект. Поэтому я использовал параметр компилятора «/ win32manifest» для ссылки на файл манифеста при компиляции.
Вот немного кода от обычая «Архив Compiler» класс, который на самом деле делает компиляцию: (я только добавил часть манифеста приложения)
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);
}
}
Однако, когда я компилирую, я держу работает в эту ошибку:
Errors building D:\Projects\MySolution\WebAppName\App_Data\MyUsername\CustomInstaller.exe error CS2007: Unrecognized option: '/win32manifest:'
У меня проблемы при поиске информации по этому вопросу, кроме статей, которые утверждают, что этот параметр существует и действует. Веб-приложение находится в visual studio 2010 и работает на платформе 2.0. Динамически скомпилированное приложение ссылается на .net 2.0 (проверено с помощью декомпилятора). Я не уверен, что EXE вызывается для выполнения компиляции или что еще я могу проверить, чтобы устранить эту проблему. Любая помощь будет оценена по достоинству.
mt.exe - это инструмент Windows SDK, он обычно не доступен на компьютере, на котором не установлено VS. –
true, мне довелось установить SDK на моей машине, поэтому я получил оттуда копию EXE, что было удобно. Те, кому это не нужно, сначала должны получить SDK. Копирование только EXE в мой проект работало нормально, он работал на веб-сервере без проблем. –