Как мне получить версию файла сборки / DLL, как показано в проводнике? AssemblyFileVersionAttribute не работает

Я хочу, чтобы «актуальная» версия DLL оставалась постоянной (в данном случае 1.0.0.0), чтобы избежать проблем со ссылками / версией. Однако я бы хотел встроить номер сборки / ревизии в DLL для целей отладки.

Похоже, что "версия сборки" и "версия файла" - это то, что я хочу. Из того, что я читал, «версия сборки» - это то, что .net использует при просмотре DLL, а «версия файла» является более или менее частным свойством только для информации - .net не использует и не ссылается на это вообще при нахождении DLL.

Я компилирую .net DLL с этим в AssemblyInfo.cs:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.536")]

Когда я просматриваю свойства DLL в проводнике, я вижу то, что я ожидал: «Версия сборки» - это «1.0.0.0», а «Версия файла» - это «1.0.0.536». Теперь я хочу прочитать и вывести версию файла в потребительском приложении asp.net.

Однако когда я иду прочитать версию файла, всегда возвращается версия сборки. Я использовал такой код:

temp = "";

temp += "Executing Assembly Info:\n";
Assembly assembly = Assembly.GetExecutingAssembly();
temp += "assembly.FullName: " + assembly.FullName + "\n";
temp += "assembly.GetName().Version: " + assembly.GetName().Version + "\n";
AssemblyVersionAttribute version = (AssemblyVersionAttribute)Attribute.GetCustomAttribute(assembly, typeof(AssemblyVersionAttribute));
if (version != null) {
    temp += "version.Version: " + version.Version + "\n";
}
AssemblyFileVersionAttribute fileVersion = (AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(assembly, typeof(AssemblyFileVersionAttribute));
if (version != null) {
    temp += "fileVersion.Version: " + fileVersion.Version + "\n";
}
temp += "\n";

temp += "Referenced Assemblies:\n";
AssemblyName[] referencedAssemblyNames = assembly.GetReferencedAssemblies();
foreach (AssemblyName referencedAssemblyName in referencedAssemblyNames) {
    if (referencedAssemblyName.FullName.Contains(MY_DLL_NAME)) {
        temp += "referencedAssemblyName.FullName: " + referencedAssemblyName.FullName + "\n";
        temp += "referencedAssemblyName.Version: " + referencedAssemblyName.Version + "\n";
    }
}
temp += "\n";

temp += "AppDomain.CurrentDomain.GetAssemblies():\n";
foreach (Assembly assembly2 in AppDomain.CurrentDomain.GetAssemblies()) {
    if (assembly2.FullName.Contains(MY_DLL_NAME)) {
        temp += "FullName: " + assembly2.FullName + "\n";
        temp += "assembly2.GetName().Name: " + assembly2.GetName().Name + "\n";
        temp += "assembly2.GetName().Version: " + assembly2.GetName().Version + "\n";
        temp += "assembly2.GetName().FullName: " + assembly2.GetName().FullName + "\n";

        version = (AssemblyVersionAttribute)Attribute.GetCustomAttribute(assembly2, typeof(AssemblyVersionAttribute));
        if (version != null) {
            temp += "version.Version: " + version.Version + "\n";
        }
        fileVersion = (AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(assembly2, typeof(AssemblyFileVersionAttribute));
        if (version != null) {
            temp += "fileVersion.Version: " + fileVersion.Version + "\n";
        }
    }
}
temp += "\n";

И я получаю такой вывод:

Executing Assembly Info:
assembly.FullName: [WEB_APPLICATION_NAME], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
assembly.GetName().Version: 1.0.0.0

Referenced Assemblies:
referencedAssemblyName.FullName: [DLL_NAME], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
referencedAssemblyName.Version: 1.0.0.0

AppDomain.CurrentDomain.GetAssemblies():
FullName: [DLL_NAME], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
assembly2.GetName().Name: [DLL_NAME]
assembly2.GetName().Version: 1.0.0.0
assembly2.GetName().FullName: [DLL_NAME], Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

В идеале я хотел бы знать, как просто запросить указанную DLL для «версии файла» (а не версии сборки, как я получаю) и показать эту строку для целей отладки / информации. Окно свойств проводника показывает и то, и другое, так что я предполагаю, что это возможно.

Я прочитал кучу других вопросов по stackoverflow, но, похоже, мне все еще не удалось получить функциональность, которую я ищу. Я ошибаюсь? Или есть лучший способ сделать это (вместо использования версии файла)?


person rocketmonkeys    schedule 08.06.2011    source источник
comment
Возможный дубликат использования C # AssemblyFileVersion в программе   -  person Cœur    schedule 07.12.2018