DLL中的GUID(.Net)

5
我在这个领域经验不是很丰富,所以我有几个问题。首先,所有由.Net创建的DLL都有自己的GUID吗?如果没有,我的问题是如何获取一个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的方法来做到这一点呢?

你打算如何“找到”它们?它们存储在 GAC 上还是本地机器上?如果是这样,那么它们必须是强名称的。如果它们只是文件,那么数据库肯定会存储它们的路径,在这一点上 GUID 只有作为验证阶段才有意义... - ShuggyCoUk
5个回答

5

我认为你可能混淆了托管程序集和COM组件。COM使用GUID来标识组件和接口,形式为类ID(CLSID)和接口ID(IID)。信息存储在注册表中,用于创建COM对象实例。.Net不使用此机制来标识程序集和类。类似的注册情况是程序集被强命名并存储在GAC中。在.Net中有几个使用GUID的地方,包括COM互操作,但程序集标识不是其中之一。


感谢您的回复,我已经更新了问题,希望能更清楚地表达我所需求的内容。 - robintw

2

[assembly: Guid("...")] 属性通常在您的 AssemblyInfo.cs 文件中定义。默认情况下,当您创建一个新项目时,Visual Studio 会自动为您提供一个 GUID,但这仅在您将程序集公开给 COM 时才有用。.NET Framework 本身不使用此值来确定如何加载程序集或以任何方式与其交互。


1
回答第二个问题(Guid -> assembly),如果dll已经加载并且您只想找到哪个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 来完成相同的操作,但是在此之后不需要释放任何内容。

0
作为 Visual Studio 用户,请查看 AssemblyInfo.cs 文件,其中定义了程序集 GUID:[assembly: Guid("abc...")]

0

我认为我们需要问的问题是:你为什么认为你的程序集需要 GUID?除非它可以用于 COM,否则你不需要通过 GUID 进行加载或注册 CLSID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接