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

时间:2009-02-02 05:49:28

标签: c# .net visual-studio-2005 .net-2.0 guid

我需要在C#.NET2.0中访问我的项目的程序集。

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

9 个答案:

答案 0 :(得分:61)

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

的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);
}

答案 1 :(得分:32)

编辑:对那些坚持downvoting的人...无法删除此答案,因为它是可接受的版本。因此,我正在编辑以包含正确的答案(下面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;

答案 2 :(得分:9)

另一种方法是使用Marshal.GetTypeLibGuidForAssembly

根据msdn:

  

将程序集导出到类型库时,会为类型库分配一个LIBID。您可以通过在程序集级别应用System.Runtime.InteropServices.GuidAttribute来显式设置LIBID,也可以自动生成它。 Tlbimp.exe(类型库导入程序)工具根据程序集的标识计算LIBID值。如果应用了该属性,GetTypeLibGuid将返回与GuidAttribute关联的LIBID。否则,GetTypeLibGuidForAssembly将返回计算的值。或者,您可以使用GetTypeLibGuid方法从现有类型库中提取实际LIBID。

答案 3 :(得分:6)

您应该能够通过反射读取程序集的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)而不是获取当前程序集 - 如果您需要读取外部程序集的这些属性(例如 - 加载插件时)

答案 4 :(得分:5)

如果其他人正在寻找一个开箱即用的工作示例,这就是我最终根据以前的答案使用的。

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();
        }
    }

答案 5 :(得分:1)

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

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

为此,您需要添加System.Runtime.InteropServices;

答案 6 :(得分:1)

或者,就这么简单:

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

为我工作...

答案 7 :(得分:1)

这里没有其他答案,但设法用这种很好的衬里解决了这个问题:

((GuidAttribute)(AppDomain.CurrentDomain.DomainManager.EntryAssembly).GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value

希望这会有所帮助!

答案 8 :(得分:0)

 string AssemblyID = Assembly.GetEntryAssembly().GetCustomAttribute<GuidAttribute>().Value;

或者,VB.NET:

  Dim AssemblyID As String = Assembly.GetEntryAssembly.GetCustomAttribute(Of GuidAttribute).Value