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


100

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

我可以在项目属性下的“汇编信息”对话框中看到GUID,此刻,我刚刚将其复制到了代码中的const中。GUID永远不会更改,因此这并不是解决方案的问题,但是直接访问它会很好。有没有办法做到这一点?

Answers:


152

请尝试以下代码。您要查找的值存储在附加到Assembly的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);
}

4
如何使用“ AppDomain.CurrentDomain.DomainManager.EntryAssembly”代替“ typeof(Program).Assembly”?好吧,我们可以更改程序类的名称,不是吗?
Kenial 2012年

11
为了节省其他人几秒钟的搜索时间,GuidAttribute位于名称空间System.Runtime.InteropServices中。
Bryce Wagner

5
@BryceWagner ctrl+.是你的朋友
MAXP

@Kenial我得到System.AppDomain.DomainManager.get returned null.一个简单的控制台应用程序。似乎Assembly.GetEntryAssembly()是首选方式。
Jesse C. Slicer

11

另一种方法是使用Marshal.GetTypeLibGuidForAssembly

根据msdn:

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


我能够在F#中执行此操作,似乎该程序集没有Guid的自定义属性
寓言

即使Assembly.ReflectionOnlyLoad不加载相关程序集,此方法也可以使用。
马丁·洛特灵

因此,完整的代码是:System.Runtime.InteropServices.Marshal.GetTypeLibGuidForAssembly(System.Reflection.Assembly.GetExecutingAssembly()).ToString()。看起来比其他方法简单得多。有没有缺点?
用户

7

或者,同样简单:

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

为我工作...


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


6
如果无论如何都要使用转换的结果,请不要使用“ as”转换。这通常是不好的样式,因为如果强制转换失败,则会得到NullReferenceException而不是信息量更大的InvalidCastException。当您不知道对象是否属于给定类型并且仅在需要时才使用它时,使用“ as”强制转换。如果不希望它是其他类型(不应该),则直接使用直接((GuidAttribute)attribs [0])。
Value。– poizan42

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

1

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

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

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


1

这里没有其他答案的运气,但设法用这种不错的衬板解决了这个问题:

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

希望这可以帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.