集合体编译后如何正确重命名?

问题描述 投票:0回答:1

在构建我的类库后,我的binDebug目录下有几个.dlls(有些来自我自己的项目,而有些来自第三方库)。例如,我的类库中有几个.dll。

MyLibrary.dll
Newtonsoft.Json.dll
NLog.dll

我想重新命名这些程序集,使它们包含版本号。例如:

MyLibrary-1.0.0.0.dll
Newtonsoft.Json-10.0.3.0.dll
NLog-2.0.0.0.dll

有什么好办法?我不能只是重命名文件。我需要更改汇编本身的名称,并将这些更改传播给任何依赖于它们的东西。

到目前为止,我已经找到了以下的解决方案(见 https:/stackoverflow.coma217538731383366。):

ildasm /all /out=MyLibrary.il MyLibrary.dll
ilasm /dll /out=MyLibrary-1.0.0.0.dll MyLibrary.il

我只是不确定这是否足以正确地更改汇编名称,我也不知道传播名称更改的最佳方式。

c# .net visual-studio .net-assembly
1个回答
1
投票

我不认为在你的项目用它们编译后重命名引用是个好主意,不知道你为什么认为需要这样做。这可能表明这是其他问题的解决方案(XY问题?). 也许一个更好的数据包管理器会有帮助 - 包裹?

总之,你可以用 Mono.Cecil.

一个快速& dirty的例子,你可以做到这一点是下面。

string fileName = args[0];
string path = Path.GetDirectoryName(fileName);
var program = AssemblyDefinition.ReadAssembly(fileName);

foreach (var reference in program.Modules[0].AssemblyReferences)
{
    var referenceFile = Path.Combine(path, reference.Name+".dll");
    if (!File.Exists(referenceFile)) continue;

    var assemblyReference = AssemblyDefinition.ReadAssembly(referenceFile);

    var newReferenceName = $"{Path.GetFileNameWithoutExtension(referenceFile)}-{assemblyReference.Name.Version}";
    var newReferenceFile = Path.Combine(path, $"{newReferenceName}{Path.GetExtension(referenceFile)}");

    var assembly = assemblyReference.MainModule.Assembly;
    assembly.MainModule.Name = Path.GetFileName(newReferenceFile);
    assemblyReference.Write(newReferenceFile);       
}

program.Write(Path.Combine(path, "rewritten.exe"));

我们正在做的只是重命名的文件名 - 添加一个版本,并改变名称,每个组件指向磁盘。保持所有的重命名与你的主汇编在同一个文件夹中,只包括本地引用。

在一个小的例子上测试,有一个项目引用和 NuGet (NLog, Newtonsoft.Json 如你的例子),重写后就能用了,但要记住,这只是处理直接引用和进入引用的引用,如果存在这样的情况,你需要根据你的需要扩展这个例子。

© www.soinside.com 2019 - 2024. All rights reserved.