0

我想将AssemblyInfo复制的可执行文件更改为新位置并保持主要可执行文件的主要信息安全。
我正在使用下面的代码将我的文件复制到具有新文件名的新位置。

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

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

AssemlyInfo新文件与源文件相同,我想更改它们。
在复制原始文件之前我该怎么做?

4

1 回答 1

1

月光,

这是可能的,但不是一个简单的解决方案。您在这里有几个选择。

我必须指出,这是为了回答你的问题。在简单复制期间无法更改装配信息。装配信息“熟化”到装配中并且不可更改。

选项1:

如果可能的话,我会在组装完成之前这样做。通常,这可以使用您可以在应用程序中移动的 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 位置
  • 编写构建后事件以重新实例化 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。

在 Nuget 上使用包 Mono.Cecil可能的。在这里您可以更改\添加程序集属性、名称等。

这是一个更改某些属性的示例(请注意,还有更多,最好使用您的调试器并查看可用属性)。

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 完成。

我希望这有帮助。

于 2014-01-06T23:41:54.543 回答