2014-01-06 2 views
0

Я хочу изменить AssemblyInfo скопированного исполняемого файла в новое место и сохранить основную информацию в файле основного исполняемого файла.
Я использую следующие коды, чтобы скопировать мой файл в новое место с новое имя файла.Как изменить информацию о сборке скопированного файла в новое место

 String fileDestination = Path.Combine(Environment.GetFolderPath(folder), "settings.exe"); 

     if (!File.Exists(fileDestination)) 
      File.Copy(Application.ExecutablePath, fileDestination); 

но AssemlyInfo нового файла такой же, как исходный файл и я хочу, чтобы изменить их.
как я могу это сделать до копирования исходного файла?

+0

AssemblyInfo необходимо будет изменить, и программа будет скомпилирована, если я не ошибаюсь. –

+0

Поскольку @ BrockHensley-FKAdirt заявила, что AssemblyInfo (версия, информация автора) задана во время компиляции. Какие части информации о сборке вы хотите изменить? – Nico

+0

Описание файла - Название продукта - Версия продукта - Оригинальное имя файла (я хочу изменить исходное имя файла из MainExe.exe в settings.exe), Оригинальное имя файла - моя цель ... – MoonLight

ответ

1

MoonLight,

Это возможно, однако, не совсем простое решение. У вас есть несколько вариантов.

Должен отметить, что ответить на ваш вопрос. Невозможно изменить информацию о сборке во время простой копии. Информация о сборке «сваривается» в сборку и не изменяется.

Вариант 1:

Если это вообще возможно, я хотел бы сделать это до того, как assemby был построен. Обычно это можно сделать с помощью информации SharedAssembly, которую вы можете перемещать по своему приложению. В этом случае вы «можете» использовать предварительную сборку «Событие» для копирования информации SharedAssembly в целевой каталог. Путь SharedAssembly довольно прост и описан здесь. http://blogs.msdn.com/b/jjameson/archive/2009/04/03/shared-assembly-info-in-visual-studio-projects.aspx Он использует процесс связанных файлов между вашими проектами решений, предоставляя все или частичную информацию о сборке (или все) для ваших проектов. В этом случае вы можете использовать событие предварительной сборки, чтобы сделать xcopy предпочтительной информации SharedAssembly, связывая, таким образом, новую информацию о сборке. Теперь, чтобы сделать этот процесс целым, я бы сделал это.

  • Создать папку с решением проблем.
  • Создайте файл SharedAssemblyInfo.cs в корневом каталоге решения и укажите общие атрибуты.
  • Добавьте файл SharedAssemblyInfo.cs в каждое решение, для которого вы хотите настроить таргетинг.
  • Создайте файл SharedAssembly2.cs с новой информацией, которую вы хотите иметь в новой цели.
  • Напишите ваши предварительно построить события для резервного копирования файла SharedAssemblyInfo.cs, переместите SharedAssebly2.cs к месту SharedAssemblyInfo.cs
  • Написать событие после сборки повторно instante файл SharedAssemblyInfo.cs. Что-то вроде.

Предварительная сборка.

xcopy /Y $(SolutionDir)SharedAssemblyInfo.cs $(SolutionDir)SharedAssemblyInfo.bak 
xcopy /Y $(SolutionDir)SharedAssembly2.cs $(SolutionDir)SharedAssemblyInfo.cs 

после сборки

xcopy /Y $(SolutionDir)SharedAssemblyInfo.bak $(SolutionDir)SharedAssemblyInfo.cs 

Вариант 2:

Существует пакет из рамок Mono, что "может" сделать это. Однако это намного сложнее, кроме того, этот пакет изменяет только определение сборки, а не Win32Resources, которые видны при просмотре вкладки Свойства файла -> details.

Использование пакета Моно.Сесил на Nuget это возможно. Здесь вы можете изменить \ добавить атрибуты сборки, имена и т. Д.

Вот образец, чтобы изменить некоторые атрибуты (обратите внимание, что есть много больше и лучше всего использовать ваш отладчик и просматривать доступные атрибуты).

static void Main(string[] args) 
{ 
    if (args.Length != 2) 
    { 
     Console.Error.WriteLine("Expected arguments: <Assembly-Path> <New-Assembly-Path>"); 
     Environment.Exit(1); 
    } 

    var assemblyPath = args[0]; 
    var newAssemblyPath = args[1]; 
    var assemblyDef = AssemblyDefinition.ReadAssembly(assemblyPath); 

    Console.WriteLine("Loaded assembly " + assemblyDef); 

    assemblyDef.Name.Name = "New Name"; 
    assemblyDef.MainModule.Name = "new Name"; 
    assemblyDef.Name.Version = new Version(1, 0, 0, 0); 

    var resources = assemblyDef.MainModule.Resources; 

    var att = assemblyDef.CustomAttributes.FirstOrDefault(x => x.AttributeType.Name == "AssemblyFileVersionAttribute"); 
    att.ConstructorArguments.Clear(); 
    att.ConstructorArguments.Add(new CustomAttributeArgument(new TypeReference("System", "string", null, null), "1.0.0.0")); 

    assemblyDef.Write(newAssemblyPath); 
} 

В конце концов, если вы действительно, действительно хотите изменить информацию о файле он будет иметь, чтобы быть сделано во время компиляции с помощью опции 1.

Я надеюсь, что это помогает.

+0

интересный человек, однако я нашел другой способ использования с классом http://msdn.microsoft.com/en-us/library/System.CodeDom.Compiler.CompilerParameters%28v=vs.110%29.aspx и воссозданием этого файла exe с помощью txt-файла. поэтому я должен рассказать людям, не способным в .net, все возможно ... – MoonLight

Смежные вопросы