| File: System\Windows\Forms\Control.ControlVersionInfo.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms\System.Windows.Forms.csproj (System.Windows.Forms) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Reflection; namespace System.Windows.Forms; public partial class Control { private class ControlVersionInfo { private string? _companyName; private string? _productName; private string? _productVersion; private FileVersionInfo? _versionInfo; private readonly Control _owner; internal ControlVersionInfo(Control owner) { _owner = owner; } /// <summary> /// The company name associated with the component. /// </summary> [UnconditionalSuppressMessage("SingleFile", "IL3002", Justification = "Single-file case is handled")] internal string CompanyName { get { if (_companyName is null) { object[] attrs = _owner.GetType().Module.Assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); if (attrs is not null && attrs.Length > 0) { _companyName = ((AssemblyCompanyAttribute)attrs[0]).Company; } if ((_companyName is null || _companyName.Length == 0) && !OwnerIsInMemoryAssembly) { _companyName = GetFileVersionInfo().CompanyName; if (_companyName is not null) { _companyName = _companyName.Trim(); } } if (_companyName is null || _companyName.Length == 0) { string? ns = _owner.GetType().Namespace; ns ??= string.Empty; int firstDot = ns.IndexOf('/'); if (firstDot != -1) { _companyName = ns[..firstDot]; } else { _companyName = ns; } } } return _companyName; } } /// <summary> /// The product name associated with this component. /// </summary> [UnconditionalSuppressMessage("SingleFile", "IL3002", Justification = "Single-file case is handled")] internal string ProductName { get { if (_productName is null) { object[] attrs = _owner.GetType().Module.Assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false); if (attrs is not null && attrs.Length > 0) { _productName = ((AssemblyProductAttribute)attrs[0]).Product; } if ((_productName is null || _productName.Length == 0) && !OwnerIsInMemoryAssembly) { _productName = GetFileVersionInfo().ProductName; if (_productName is not null) { _productName = _productName.Trim(); } } if (_productName is null || _productName.Length == 0) { string? ns = _owner.GetType().Namespace; ns ??= string.Empty; int firstDot = ns.IndexOf('.'); if (firstDot != -1) { _productName = ns[(firstDot + 1)..]; } else { _productName = ns; } } } return _productName; } } /// <summary> /// The product version associated with this component. /// </summary> [UnconditionalSuppressMessage("SingleFile", "IL3002", Justification = "Single-file case is handled")] internal string ProductVersion { get { if (_productVersion is null) { // custom attribute object[] attrs = _owner.GetType().Module.Assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false); if (attrs is not null && attrs.Length > 0) { _productVersion = ((AssemblyInformationalVersionAttribute)attrs[0]).InformationalVersion; } // win32 version info if ((_productVersion is null || _productVersion.Length == 0) && !OwnerIsInMemoryAssembly) { _productVersion = GetFileVersionInfo().ProductVersion; if (_productVersion is not null) { _productVersion = _productVersion.Trim(); } } // fake it if (_productVersion is null || _productVersion.Length == 0) { _productVersion = "1.0.0.0"; } } return _productVersion; } } /// <summary> /// Retrieves the FileVersionInfo associated with the main module for the component. /// </summary> [RequiresAssemblyFiles($"Throws if {nameof(_owner)} is an in-memory assembly. Check {nameof(OwnerIsInMemoryAssembly)} first")] private FileVersionInfo GetFileVersionInfo() { if (_versionInfo is null) { string path = _owner.GetType().Module.FullyQualifiedName; _versionInfo = FileVersionInfo.GetVersionInfo(path); } return _versionInfo; } // We're deliberately checking for the empty string scenario to see if this is single-file. #pragma warning disable IL3000 // Avoid accessing Assembly file path when publishing as a single file private bool OwnerIsInMemoryAssembly => _owner.GetType().Assembly.Location.Length == 0; #pragma warning restore IL3000 } }