在构建我的类库后,我的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
我只是不确定这是否足以正确地更改汇编名称,我也不知道传播名称更改的最佳方式。
我不认为在你的项目用它们编译后重命名引用是个好主意,不知道你为什么认为需要这样做。这可能表明这是其他问题的解决方案(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
如你的例子),重写后就能用了,但要记住,这只是处理直接引用和进入引用的引用,如果存在这样的情况,你需要根据你的需要扩展这个例子。