【问题标题】:GUIDs in DLLs (.Net)DLL (.Net) 中的 GUID
【发布时间】:2009-01-28 22:33:42
【问题描述】:

我在这方面不是很有经验 - 所以我有几个问题。首先,所有 .Net 创建的 DLL 都有自己的 GUID 吗?如果没有,我的问题是如何获得一个并将其与 DLL 关联。

那么问题是,我如何获得该 dll 的 GUID - 即。给定一个 DLL 路径 (c:\some\path\to\a\file.dll) 我如何确定它的 GUID?另外,有没有一种简单的方法可以走另一条路(GUID -> DLL) - 我已经读过一些关于这个但很多都是指VB6 DLLs和COM的东西......这仍然适用于.Net DLLs ?

更新:感谢您的回答。也许我问错了问题。我希望我的每个 DLL 文件都有一个唯一的 ID,以便我可以在数据库中引用它们。我希望能够获取存储在数据库中的唯一 ID,然后轻松找到 DLL 并用它做一些事情。根据答案所说,也许我不应该使用 GUID,那么有没有 .Net 方法可以做到这一点?

【问题讨论】:

  • 那么您打算如何“找到”他们。它们存储在哪里,在您本地机器上的 gac 中?如果是这样,那么它们必须被强命名,如果它们只是文件,那么数据库肯定会存储它们的路径,此时 guid 毫无意义,除非作为验证阶段......

标签: .net dll guid


【解决方案1】:

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

【讨论】:

  • 感谢您的回复,我现在已经更新了这个问题,希望能让我所寻找的内容更加清晰。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    要回答第二个问题(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 来执行同样的东西,但之后不需要发布任何东西。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 2011-12-25
          • 2014-10-27
          • 1970-01-01
          • 2012-08-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多