我想比較3.5中創建的軟件版本和舊版本。如果我嘗試在4.0中比較版本,那麼使用Version.Parse
很容易,但在早期版本中,此工具不在那裏。我試圖通過使用字符串比較來比較它,但仍然無法獲得所需的輸出,因爲字符串比較不允許我與次要版本或主要版本進行比較。提前致謝。如何將字符串轉換爲.net 3.5中的版本?
6
A
回答
2
我遇到了類似的問題 - 我不得不解析和分類建立號碼,以便他們可以顯示降序排列的用戶。我最終編寫了自己的類來包裝構建編號的各個部分,並實現了用於排序的IComparable。也結束了超載和小於運營商,以及Equals
方法。我認爲它具有Version類的大部分功能,除了MajorRevision和MinorRevision之外,我從來沒有使用它。
事實上,你可以將它重命名爲'Version',並像使用'真實'類一樣使用它。
下面的代碼:
public class BuildNumber : IComparable
{
public int Major { get; private set; }
public int Minor { get; private set; }
public int Build { get; private set; }
public int Revision { get; private set; }
private BuildNumber() { }
public static bool TryParse(string input, out BuildNumber buildNumber)
{
try
{
buildNumber = Parse(input);
return true;
}
catch
{
buildNumber = null;
return false;
}
}
/// <summary>
/// Parses a build number string into a BuildNumber class
/// </summary>
/// <param name="buildNumber">The build number string to parse</param>
/// <returns>A new BuildNumber class set from the buildNumber string</returns>
/// <exception cref="ArgumentException">Thrown if there are less than 2 or
/// more than 4 version parts to the build number</exception>
/// <exception cref="FormatException">Thrown if string cannot be parsed
/// to a series of integers</exception>
/// <exception cref="ArgumentOutOfRangeException">Thrown if any version
/// integer is less than zero</exception>
public static BuildNumber Parse(string buildNumber)
{
if (buildNumber == null) throw new ArgumentNullException("buildNumber");
var versions = buildNumber
.Split(new[] {'.'},
StringSplitOptions.RemoveEmptyEntries)
.Select(v => v.Trim())
.ToList();
if (versions.Count < 2)
{
throw new ArgumentException("BuildNumber string was too short");
}
if (versions.Count > 4)
{
throw new ArgumentException("BuildNumber string was too long");
}
return new BuildNumber
{
Major = ParseVersion(versions[0]),
Minor = ParseVersion(versions[1]),
Build = versions.Count > 2 ? ParseVersion(versions[2]) : -1,
Revision = versions.Count > 3 ? ParseVersion(versions[3]) : -1
};
}
private static int ParseVersion(string input)
{
int version;
if (!int.TryParse(input, out version))
{
throw new FormatException(
"buildNumber string was not in a correct format");
}
if (version < 0)
{
throw new ArgumentOutOfRangeException(
"buildNumber",
"Versions must be greater than or equal to zero");
}
return version;
}
public override string ToString()
{
return string.Format("{0}.{1}{2}{3}", Major, Minor,
Build < 0 ? "" : "." + Build,
Revision < 0 ? "" : "." + Revision);
}
public int CompareTo(object obj)
{
if (obj == null) return 1;
var buildNumber = obj as BuildNumber;
if (buildNumber == null) return 1;
if (ReferenceEquals(this, buildNumber)) return 0;
return (Major == buildNumber.Major)
? (Minor == buildNumber.Minor)
? (Build == buildNumber.Build)
? Revision.CompareTo(buildNumber.Revision)
: Build.CompareTo(buildNumber.Build)
: Minor.CompareTo(buildNumber.Minor)
: Major.CompareTo(buildNumber.Major);
}
public static bool operator >(BuildNumber first, BuildNumber second)
{
return (first.CompareTo(second) > 0);
}
public static bool operator <(BuildNumber first, BuildNumber second)
{
return (first.CompareTo(second) < 0);
}
public override bool Equals(object obj)
{
return (CompareTo(obj) == 0);
}
public override int GetHashCode()
{
unchecked
{
var hash = 17;
hash = hash * 23 + Major.GetHashCode();
hash = hash * 23 + Minor.GetHashCode();
hash = hash * 23 + Build.GetHashCode();
hash = hash * 23 + Revision.GetHashCode();
return hash;
}
}
}
1
您可以隨時嘗試反編譯.NET 4.0版本類 - 您可能很幸運,它只適用於.NET 3.5。
否則,你應該看看字符串拆分或正則表達式。
1
你似乎在問如何獲取任何本地.NET安裝的版本。 MSDN有一篇關於此的文章:http://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx。
它們包括以下功能其中:
private static void GetVersionFromRegistry()
{
// Opens the registry key for the .NET Framework entry.
using (RegistryKey ndpKey =
RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "").
OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
{
// As an alternative, if you know the computers you will query are running .NET Framework 4.5
// or later, you can use:
// using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
// RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
foreach (string versionKeyName in ndpKey.GetSubKeyNames())
{
if (versionKeyName.StartsWith("v"))
{
RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
string name = (string)versionKey.GetValue("Version", "");
string sp = versionKey.GetValue("SP", "").ToString();
string install = versionKey.GetValue("Install", "").ToString();
if (install == "") //no install info, must be later.
Console.WriteLine(versionKeyName + " " + name);
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(versionKeyName + " " + name + " SP" + sp);
}
}
if (name != "")
{
continue;
}
foreach (string subKeyName in versionKey.GetSubKeyNames())
{
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name = (string)subKey.GetValue("Version", "");
if (name != "")
sp = subKey.GetValue("SP", "").ToString();
install = subKey.GetValue("Install", "").ToString();
if (install == "") //no install info, must be later.
Console.WriteLine(versionKeyName + " " + name);
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name + " SP" + sp);
}
else if (install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name);
}
}
}
}
}
}
}
3
原諒我,如果我在想念的東西,但你不能使用版本對象構造函數傳遞你的版本字符串:
相關問題
- 1. 將日期轉換爲.net 3.5中的字符串
- 2. 如何將C++字符串轉換爲.NET字符串^?
- 3. 將curl_version()轉換爲版本字符串的24位版本號
- 4. 將system._comobject轉換爲.net字符串
- 5. 如何將SID轉換爲.net中的字符串
- 6. 如何將Unicode轉義序列轉換爲.NET字符串中的Unicode字符?
- 7. .Net將字符串轉換爲HTML轉義字符的方法
- 8. 如何在.NET中將字符串轉換爲日期時間?
- 9. 如何將字符串轉換爲Perl中的unicode字符串
- 10. 將.Net Compact Framework 3.5轉換爲.Net Core
- 11. 如何將字符串的字符串轉換爲字符?
- 12. 將字符串轉換爲.net中的日期.net
- 13. 如何將字符串轉換爲Int?
- 14. 將.net字符串對象轉換爲base64編碼字符串
- 15. 將ASCII轉換爲.NET中的字符
- 16. 如何將字符串轉換爲非字符串在matlab中
- 17. 將字符串轉換爲字符串
- 18. 如何將org.jdom.Document轉換爲字符串
- 19. 如何將HTMLElement轉換爲字符串
- 20. 如何將字符串轉換爲u8?
- 21. 如何將字符串轉換爲UInt32?
- 22. 如何將Ada.Real_TIme.Time轉換爲字符串?
- 23. 如何將NSOpenPanel.URL轉換爲字符串?
- 24. 如何將.NET標準格式字符串轉換爲Excel格式字符串
- 25. 如何將JTextField轉換爲字符串和字符串爲JTextField?
- 26. 如何將ArrayList轉換爲字符串?
- 27. 如何將字符串轉換爲宏?
- 28. 如何將$ GLOBALS轉換爲字符串?
- 29. 如何將HtmlAttribute轉換爲字符串?
- 30. 如何將Biginteger轉換爲字符串
遺憾地說,它只有兩個與版本相關的方法,但沒有解析方法。第二種方法值得嘗試,但它需要更多的代碼。 – 2014-10-27 05:34:58