Как получить "Версия файла" сборки /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-библиотеку, на которую ссылаются, для "Версии файла" (не версии сборки, как я получаю) и показать эту строку для целей отладки / информации. Окно свойств Проводника показывает оба, поэтому я предполагаю, что это возможно.

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

1 ответ

Решение

Существует аналогичный пост о получении информации о версии файла сборок здесь: C# AssemblyFileVersion использование в программе

Другие вопросы по тегам