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