当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何以编程方式获取.net2.0中的应用程序的GUID》经验,为你挑选了5个好方法。

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

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



1> JaredPar..:

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


为了节省其他人几秒钟的谷歌搜索,GuidAttribute位于命名空间System.Runtime.InteropServices中.
如何使用'AppDomain.CurrentDomain.DomainManager.EntryAssembly'而不是'typeof(Program).Assembly'?好吧,我们可以改变Program类的名字,不是吗?

2> Cerebrus..:

编辑:对那些坚持downvoting的人...无法删除此答案,因为它是可接受的版本.因此,我正在编辑以包含正确的答案(JaredPar的代码如下)

如果您只想获得执行程序集,那么很简单:

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;


这将为您提供System.Reflection.Assembly类型的GUID,而不是他的[assembly:Guid(....)].他正在寻找他的集会的GuidAttribute.amazedsaint和JaredPar的答案是正确的答案.
我参加这个派对已经很晚了,但我会在这里第二次@Yoopergeek.在我理解所说的内容及其后果之前,我花了大约30分钟在单元测试中使用此代码.这是一个非常误导的答案.

3> andrey.ko..:

另一种方法是使用Marshal.GetTypeLibGuidForAssembly.

根据msdn:

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



4> amazedsaint..:

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


如果您打算使用演员的结果,请不要使用"as"演员阵容.它通常是错误的样式,因为如果转换失败,您将获得NullReferenceException而不是更具信息性的InvalidCastException.当你不知道对象是否属于给定类型并且只是想要使用它时,"as"强制转换.只需使用直接((GuidAttribute)attribs [0]).相反,如果你不希望它是另一种类型(它不应该)

5> Okuma.Scott..:

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

using System.Reflection;
using System.Runtime.InteropServices;

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

更新:

由于这引起了一点点的关注,我决定采用另一种方式来做我一直在使用的方法.这种方式允许您从静态类中使用它:

    /// 
    /// public GUID property for use in static class 
    ///  
    /// Returns the application GUID or "" if unable to get it. 
    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();
        }
    }

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有