4

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

4

5 回答 5

4

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

于 2009-01-28T22:48:22.993 回答
2

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

于 2009-01-28T22:49:34.160 回答
0

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

于 2009-01-28T22:38:40.580 回答
0

我认为我们必须要问的问题是,为什么您认为您的程序集需要 GUID?除非它是 COM 可用的,否则您不会按 GUID 加载或注册 CLSID。

于 2009-01-28T22:46:30.253 回答
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 来做同样的事情,但之后不需要释放任何东西.

于 2009-01-28T22:52:58.100 回答