[英]How can I properly rename assemblies after they're been compiled?
在构建了我的 class 库之后,我的 bin/Debug 目录中有几个.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.com/a/21753873/1383366 ):
ildasm /all /out=MyLibrary.il MyLibrary.dll
ilasm /dll /out=MyLibrary-1.0.0.0.dll MyLibrary.il
我不仅不确定这是否足以正确更改程序集名称,而且我不知道传播名称更改的最佳方式。
我认为在使用它们编译项目之后重命名引用并不是一个好主意,并且不确定为什么你认为需要这样做。 这可能表明这是对其他问题( XY 问题?)的解决方案。 也许更好的数据包管理器会有所帮助 - Paket ?
无论如何,您可以使用Mono.Cecil重命名引用。
一个快速而肮脏的例子如下:
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
),它在重写后工作,但请记住,它只是处理直接引用并进入引用的引用,如果存在的话,您需要将此示例扩展到您的需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.