using System; using System.Drawing; using System.Globalization; using System.IO; using System.Reflection; using System.Text; using System.Windows.Forms; namespace PaintDotNet { /// /// 特定的本应用程序相关的功能 /// public static class PdnInfo { private static Icon appIcon; public static Icon AppIcon { get { if (appIcon == null) { Stream stream = PdnResources.GetResourceStream("Icons.Metis.ico"); appIcon = new Icon(stream); stream.Close(); } return appIcon; } } /// /// Gets the full path to where user customization files should be stored. /// /// /// User data files should include settings or customizations that don't go into data files such as *.PDN. /// An example of a user data file is a color palette. /// public static string UserDataPath { get { string myDocsPath = SystemLayer.Shell.GetVirtualPath(PaintDotNet.SystemLayer.VirtualFolderName.UserDocuments, true); string userDataDirName = PdnResources.GetString("SystemLayer.UserDataDirName"); string userDataPath = Path.Combine(myDocsPath, userDataDirName); return userDataPath; } } private static StartupTestType startupTest = StartupTestType.None; public static StartupTestType StartupTest { get { return startupTest; } set { startupTest = value; } } private static bool isTestMode = false; public static bool IsTestMode { get { return isTestMode; } set { isTestMode = value; } } public static DateTime BuildTime { get { Version version = GetVersion(); DateTime time = new DateTime(2000, 1, 1, 0, 0, 0); time = time.AddDays(version.Build); time = time.AddSeconds(version.Revision * 2); return time; } } private static string GetAppConfig() { object[] attributes = typeof(PdnInfo).Assembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false); AssemblyConfigurationAttribute aca = (AssemblyConfigurationAttribute)attributes[0]; return aca.Configuration; } private static readonly bool isFinalBuild = GetIsFinalBuild(); private static bool GetIsFinalBuild() { return !(GetAppConfig().IndexOf("Final") == -1); } public static bool IsFinalBuild { get { return isFinalBuild; } } public static bool IsDebugBuild { get { #if DEBUG return true; #else return false; #endif } } // Pre-release builds expire after this many days. (debug+"final" also equals expiration) public const int BetaExpireTimeDays = 60; public static DateTime ExpirationDate { get { if (PdnInfo.IsFinalBuild && !IsDebugBuild) { return DateTime.MaxValue; } else { return PdnInfo.BuildTime + new TimeSpan(BetaExpireTimeDays, 0, 0, 0); } } } public static bool IsExpired { get { if (!PdnInfo.IsFinalBuild || PdnInfo.IsDebugBuild) { if (DateTime.Now > PdnInfo.ExpirationDate) { return true; } } return false; } } public static bool HandleExpiration(IWin32Window owner) { if (IsExpired) { string expiredMessage = PdnResources.GetString("ExpiredDialog.Message"); DialogResult result = MessageBox.Show(expiredMessage, PdnInfo.GetProductName(true), MessageBoxButtons.OKCancel); if (result == DialogResult.OK) { string expiredRedirect = "http://www.baidu.com"; //InvariantStrings.ExpiredPage; PdnInfo.LaunchWebSite(owner, expiredRedirect); } return false; } return true; } public static string GetApplicationDir() { string appPath = Application.StartupPath; return appPath; } public static string GetProductName() { return GetProductName(!IsFinalBuild); } public static string GetProductName(bool withTag) { string bareProductName = GetBareProductName(); string productNameFormat = PdnResources.GetString("Application.ProductName.Format"); string tag; if (withTag) { string tagFormat = PdnResources.GetString("Application.ProductName.Tag.Format"); tag = string.Format(tagFormat, GetAppConfig()); } else { tag = string.Empty; } string version = GetVersionNumberString(GetVersion(), 3); string productName = string.Format( productNameFormat, bareProductName, version, tag); return productName; } public static string GetBareProductName() { return "Metis Vision";//PdnResources.GetString("Application.ProductName.Bare"); } private static string copyrightString = null; public static string GetCopyrightString() { /*if (copyrightString == null) { string format = " Corporation. {0}"; string allRightsReserved = PdnResources.GetString("Application.Copyright.AllRightsReserved"); copyrightString = string.Format(CultureInfo.CurrentCulture, format, allRightsReserved); } return copyrightString;*/ copyrightString = "Copyright 2020 HuiHong. All rights reserved."; return copyrightString; } public static Version GetVersion() { return new Version(Application.ProductVersion); } private static string GetConfigurationString() { object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false); AssemblyConfigurationAttribute aca = (AssemblyConfigurationAttribute)attributes[0]; return aca.Configuration; } /// /// Returns a full version string of the form: ApplicationConfiguration + BuildType + BuildVersion /// i.e.: "Beta 2 Debug build 1.0.*.*" /// /// public static string GetVersionString() { string buildType = #if DEBUG "Debug"; #else "Release"; #endif string versionFormat = PdnResources.GetString("PdnInfo.VersionString.Format"); string versionText = string.Format( versionFormat, GetConfigurationString(), buildType, GetVersionNumberString(GetVersion(), 4)); //return versionText; return ""; } /// /// Returns a string for just the version number, i.e. "3.01" /// /// public static string GetVersionNumberString(Version version, int fieldCount) { if (fieldCount < 1 || fieldCount > 4) { throw new ArgumentOutOfRangeException("fieldCount", "must be in the range [1, 4]"); } StringBuilder sb = new StringBuilder(); sb.Append(version.Major.ToString()); if (fieldCount >= 2) { //sb.AppendFormat(".{0}", version.Minor.ToString("D2")); } if (fieldCount >= 3) { sb.AppendFormat(".{0}", version.Build.ToString()); } if (fieldCount == 4) { sb.AppendFormat(".{0}", version.Revision.ToString()); } return sb.ToString(); } public static string GetFriendlyVersionString() { Version version = PdnInfo.GetVersion(); string versionFormat = PdnResources.GetString("PdnInfo.FriendlyVersionString.Format"); string configFormat = PdnResources.GetString("PdnInfo.FriendlyVersionString.ConfigWithSpace.Format"); string config = string.Format(configFormat, GetConfigurationString()); string configText; if (PdnInfo.IsFinalBuild) { configText = string.Empty; } else { configText = config; } string versionText = string.Format(versionFormat, GetVersionNumberString(version, 2), configText); return versionText; } public static string GetFullAppName() { return PdnInfo.GetProductName(false); //string fullAppNameFormat = PdnResources.GetString("PdnInfo.FullAppName.Format"); //string fullAppName = string.Format(fullAppNameFormat, PdnInfo.GetProductName(false), GetVersionString()); //return fullAppName; } public static string GetAppName() { if (PdnInfo.IsFinalBuild && !PdnInfo.IsDebugBuild) { return PdnInfo.GetProductName(false); } else { return GetFullAppName(); } } public static void LaunchWebSite(IWin32Window owner) { LaunchWebSite(owner, null); } public static void LaunchWebSite(IWin32Window owner, string page) { string webSite = "http://www.baidu.com";// InvariantStrings.WebsiteUrl; Uri baseUri = new Uri(webSite); Uri uri; if (page == null) { uri = baseUri; } else { uri = new Uri(baseUri, page); } string url = uri.ToString(); if (url.IndexOf("@") == -1) { OpenUrl(owner, url); } } public static bool OpenUrl(IWin32Window owner, string url) { bool result = SystemLayer.Shell.LaunchUrl(owner, url); if (!result) { string messageFormat = PdnResources.GetString("LaunchLink.Error.Format"); string message = string.Format(messageFormat, url); MessageBox.Show(owner, message, PdnInfo.GetBareProductName(), MessageBoxButtons.OK, MessageBoxIcon.Error); } return result; } public static string GetNgenPath() { return GetNgenPath(false); } public static string GetNgenPath(bool force32bit) { string fxDir; if (UIntPtr.Size == 8 && !force32bit) { fxDir = "Framework64"; } else { fxDir = "Framework"; } string fxPathBase = @"%WINDIR%\Microsoft.NET\" + fxDir + @"\v"; string fxPath = fxPathBase + Environment.Version.ToString(3) + @"\"; string fxPathExp = System.Environment.ExpandEnvironmentVariables(fxPath); string ngenExe = Path.Combine(fxPathExp, "ngen.exe"); return ngenExe; } } }