我在这方面不是很有经验 - 所以我有几个问题。首先,所有.Net创建的DLL都有自己的GUID吗?如果没有,我的问题是如何获得一个并将其与DLL相关联。
然后问题是,我如何获得该DLL的GUID - 即。给定一个DLL路径(c:\ some \ path \ to \ a \ _ file.dll)如何确定其GUID?另外,有没有一种简单的方法去另一种方式(GUID - > DLL) - 我已经阅读了一些关于这个,但很多它指的是VB6 DLL和COM的东西...这仍然适用于.Net的DLL?
更新:感谢您的回答。也许我问的是错误的问题。我希望每个DLL文件都有一个唯一的ID,以便我可以在数据库中引用它们。我希望能够获取存储在数据库中的唯一ID,然后轻松找到DLL并用它做一些事情。根据答案所说,也许我不应该使用GUID,那么有没有.Net方式呢?
答案 0 :(得分:3)
我认为您可能会在托管程序集和COM组件之间感到困惑。 COM使用GUID以类ID(CLSID)和接口ID(IID)的形式标识组件和接口。信息存储在注册表中,用于创建COM对象实例。 .Net不使用此机制来标识程序集和类。类似的注册情况是程序集strong named并存储在GAC中。在.Net中有几个GUID 的地方 - 包括COM互操作 - 但是汇编识别不是其中之一。
答案 1 :(得分:2)
[assembly:Guid(“...”)]属性通常在AssemblyInfo.cs文件中定义。默认情况下,当您创建一个新项目时,Visual Studio会自动为您提供一个Guid,但这实际上只有在您将程序集公开给COM时才有用。 .NET Framework本身不使用此值来确定如何加载程序集或以任何方式与其交互。
答案 2 :(得分:0)
作为Visual Studio用户,请查看AssemblyInfo.cs,其中定义了程序集GUID
[assembly: Guid("abc...")]
答案 3 :(得分:0)
我认为我们要问的问题是为什么你认为你的装配需要一个GUID?您不能通过GUID加载或注册CLSID,除非它是COM可用的。
答案 4 :(得分:0)
要回答第二个问题(Guid - >汇编),如果dll已经加载并且您只想找到哪一个有guid(如果有的话),那么这很简单
using System;
using System.Reflection;
using System.Runtime.InteropServices;
static Assembly FindAssemblyForGuid(Guid match)
{
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
object[] attributes = a.GetCustomAttributes(typeof(GuidAttribute)) ;
if ( attributes.Length > 0 )
{
foreach (GuidAttribute g in attributes )
{
if (g.Value == match)
return a;
}
}
}
return null; // failed to find it
}
如果你想这样做没有它被加载你需要将它加载到一个临时应用程序域,检查它,然后删除应用程序域或使用非托管内省api来执行同样的事情,但不需要在之后发布任何东西。