我需要在 C# .NET 2.0 中访问我的项目的程序集。
我可以在项目属性下的“装配信息”对话框中看到 GUID,目前我刚刚将它复制到代码中的 const 中。GUID 永远不会改变,所以这不是一个糟糕的解决方案,但直接访问它会很好。有没有办法做到这一点?
我需要在 C# .NET 2.0 中访问我的项目的程序集。
我可以在项目属性下的“装配信息”对话框中看到 GUID,目前我刚刚将它复制到代码中的 const 中。GUID 永远不会改变,所以这不是一个糟糕的解决方案,但直接访问它会很好。有没有办法做到这一点?
试试下面的代码。您要查找的值存储在附加到程序集的 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);
}
另一种方法是使用Marshal.GetTypeLibGuidForAssembly。
根据MSDN:
将程序集导出到类型库时,会为类型库分配一个 LIBID。您可以通过在程序集级别应用 System.Runtime.InteropServices.GuidAttribute 来显式设置 LIBID,也可以自动生成它。Tlbimp.exe(类型库导入程序)工具根据程序集的标识计算 LIBID 值。GetTypeLibGuid 返回与 GuidAttribute 关联的 LIBID(如果应用了该属性)。否则,GetTypeLibGuidForAssembly 返回计算值。或者,您可以使用 GetTypeLibGuid 方法从现有类型库中提取实际的 LIBID。
您应该能够通过反射读取程序集的 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 和所有程序集)而不是获取当前程序集。
或者,同样简单:
string assyGuid = Assembly.GetExecutingAssembly().GetCustomAttribute<GuidAttribute>().Value.ToUpper();
这个对我有用...
对于一个开箱即用的工作示例,这是我根据之前的答案最终使用的。
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();
}
}
其他答案在这里没有任何运气,但我设法用这个漂亮的单线解决了这个问题:
((GuidAttribute)(AppDomain.CurrentDomain.DomainManager.EntryAssembly).GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value
要获取 appID,您可以使用以下代码行:
var applicationId = ((GuidAttribute)typeof(Program).Assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;
为此,您需要包括System.Runtime.InteropServices;
string AssemblyID = Assembly.GetEntryAssembly().GetCustomAttribute<GuidAttribute>().Value;
或者,VB.NET:
Dim AssemblyID As String = Assembly.GetEntryAssembly.GetCustomAttribute(Of GuidAttribute).Value