116

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

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

4

8 回答 8

165

试试下面的代码。您要查找的值存储在附加到程序集的 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);
}
于 2009-02-02T06:03:26.697 回答
11

另一种方法是使用Marshal.GetTypeLibGuidForAssembly

根据MSDN

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

于 2012-07-14T18:00:25.453 回答
8

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

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

如果您想阅读诸如 AssemblyTitle、AssemblyVersion 等内容,您也可以将 GuidAttribute 替换为其他属性。

如果您需要读取外部程序集的这些属性(例如,在加载插件时),您还可以加载另一个程序集(Assembly.LoadFrom 和所有程序集)而不是获取当前程序集。

于 2009-02-02T05:52:08.403 回答
8

或者,同样简单:

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

这个对我有用...

于 2018-08-30T17:19:20.123 回答
6

对于一个开箱即用的工作示例,这是我根据之前的答案最终使用的。

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();
        }
    }
于 2013-12-19T21:25:29.483 回答
1

其他答案在这里没有任何运气,但我设法用这个漂亮的单线解决了这个问题:

((GuidAttribute)(AppDomain.CurrentDomain.DomainManager.EntryAssembly).GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value
于 2020-06-08T18:49:31.597 回答
0

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

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

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

于 2016-06-01T07:34:26.493 回答
0
 string AssemblyID = Assembly.GetEntryAssembly().GetCustomAttribute<GuidAttribute>().Value;

或者,VB.NET:

  Dim AssemblyID As String = Assembly.GetEntryAssembly.GetCustomAttribute(Of GuidAttribute).Value
于 2021-02-25T19:38:01.810 回答