DLL 中的 GUID (.Net)

rob*_*ntw 5 .net dll guid

我在这方面不是很有经验 - 所以我有几个问题。首先,所有 .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 方法可以做到这一点?

Stu*_*lar 5

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


Shu*_*oUk 1

要回答第二个问题(Guid -> 程序集),如果 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
}
Run Code Online (Sandbox Code Playgroud)

如果您想在不加载它的情况下执行此操作,则需要将其加载到临时应用程序域中,检查它,然后删除应用程序域或使用非托管内省 api 执行相同的操作,但无需在之后释放任何内容。