代码之家  ›  专栏  ›  技术社区  ›  Nathan

如何在.net2.0中以编程方式获取应用程序的guid

  •  40
  • Nathan  · 技术社区  · 15 年前

    我需要访问我的项目在C.net2.0中的组装。

    我可以在“程序集信息”对话框的“项目属性”下看到guid,现在我刚刚将其复制到代码中的常量。guid永远不会改变,所以这不是解决方案的坏处,但是直接访问它会很好。有办法吗?

    7 回复  |  直到 6 年前
        1
  •  61
  •   Emrys Myrooin    8 年前

    尝试以下代码。您要查找的值存储在附加到程序集的guidattribute实例上。

    using System.Runtime.InteropServices;
    
    static void Main(string[] args)
    {
        var assembly = typeof(Program).Assembly;
        var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
        var id = attribute.Value;
        Console.WriteLine(id);
    }
    
        2
  •  31
  •   Community Egal    7 年前

    编辑:对于那些坚持投反对票的人…无法删除此答案,因为它是可接受的版本。因此,正在编辑以包含正确的答案( JaredPar's code 以下)

    如果只想获取正在执行的程序集,则足够简单:

    using System.Reflection;
    
    Assembly assembly = Assembly.GetExecutingAssembly();
    
    //The following line (part of the original answer) is misleading.
    //**Do not** use it unless you want to return the System.Reflection.Assembly type's GUID.
    Console.WriteLine(assembly.GetType().GUID.ToString());
    
    
    // The following is the correct code.
    var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
    var id = attribute.Value;
    
        3
  •  9
  •   andrey.ko    12 年前

    另一种方法是 Marshal.GetTypeLibGuidForAssembly .

    根据msdn:

    将程序集导出到类型库时,将为类型库分配libid。可以通过在程序集级别应用system.runtime.interopservices.guidattribute显式设置libid,也可以自动生成libid。tlbimp.exe(类型库导入程序)工具根据程序集的标识计算libid值。如果应用了该属性,gettypelibguid将返回与guidattribute关联的libid。否则,gettypelibguidforassembly返回计算值。或者,可以使用gettypelibguid方法从现有类型库中提取实际的libid。

        4
  •  6
  •   amazedsaint    15 年前

    您应该能够通过反射读取程序集的guid属性。这将获取当前程序集的GUID

             Assembly asm = Assembly.GetExecutingAssembly();
            var attribs = (asm.GetCustomAttributes(typeof(GuidAttribute), true));
            Console.WriteLine((attribs[0] as GuidAttribute).Value);
    

    如果要读取assemblyTitle、assemblyVersion等内容,也可以将guidattribute替换为其他属性。

    如果需要读取外部程序集的这些属性(例如加载插件时),也可以加载其他程序集(assembly.loadfrom和all),而不是获取当前程序集。

        5
  •  5
  •   Scott Solmer    10 年前

    如果其他人正在寻找开箱即用的工作示例,那么这就是我根据前面的答案使用的结果。

    using System.Reflection;
    using System.Runtime.InteropServices;
    
    label1.Text = "GUID: " + ((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute), false)).Value.ToUpper();
    

    更新:

    因为这已经引起了一点注意,我决定加入另一种我一直使用的方法。通过这种方式,您可以从静态类中使用它:

        /// <summary>
        /// public GUID property for use in static class </summary>
        /// <returns> 
        /// Returns the application GUID or "" if unable to get it. </returns>
        static public string AssemblyGuid
        {
            get
            {
                object[] attributes = Assembly.GetEntryAssembly().GetCustomAttributes(typeof(GuidAttribute), false);
                if (attributes.Length == 0) { return String.Empty; }
                return ((System.Runtime.InteropServices.GuidAttribute)attributes[0]).Value.ToUpper();
            }
        }
    
        6
  •  1
  •   user3089358    6 年前

    或者,同样简单:

    string assyGuid = Assembly.GetExecutingAssembly().GetCustomAttribute<GuidAttribute>().Value.ToUpper();
    

    为我工作…

        7
  •  0
  •   drgmak    8 年前

    要获取AppID,可以使用以下代码行:

    var applicationId = ((GuidAttribute)typeof(Program).Assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;
    

    为此,您需要包括 System.Runtime.InteropServices;