代码之家  ›  专栏  ›  技术社区  ›  James Kolpack

动态加载程序集的程序集属性

  •  0
  • James Kolpack  · 技术社区  · 14 年前

    我使用的是第三方库,它要求在使用静态方法之前调用它——它设置串行密钥来验证软件的许可证。我需要在多个项目中使用这个库,并且我想避免那些项目需要担心这个许可证。理想情况下,我想创建一个共享程序集,该程序集将处理许可并由使用库的项目引用,并将这些项目与正在进行的任何许可隔离开来。

    开始考虑实现这一点的一种方法是使用汇编属性。所以,我做了一个有一个承包商来设置许可证:

    [AttributeUsage(AttributeTargets.Assembly)]
    public class LibraryLicenseAttribute : Attribute
    {
      public LibraryLicenseAttribute()
      {
        Lib.SetLicense("valid key");
      }
    }
    

    并将其放置在包装项目中:

    LibraryWrapperProject
      Properties
        AssemblyInfo.cs
      References
        Lib.dll
      LibraryLicenseAttribute.cs
    

    并通过将其包含在assemblyinfo.cs中来调用它:

    [LibraryLicense]
    

    现在,我可以在另一个使用库的项目中引用此项目:

    LibraryUserProject
      References
        LibraryWrapperProject
      LibraryUser.cs
    

    …但是当我去图书馆的时候…

    class LibraryUser
    {
      public LibraryUser()
      {
        Lib.Use();
      }
    }
    

    它报告许可证尚未设置。我发现可以在调用项目的assemblyinfo.cs中包含该属性,该属性将被调用。这比将许可证重新分配给所有下游项目要好,但他们仍然需要额外的资金才能使其发挥作用。

    此外,有些项目是动态加载的Elseware。例如:

    Assembly.Load("LibraryUserProject.dll");
    

    动态加载包含它的程序集时,如何调用授权程序集属性?有没有其他的.NET框架功能可以使这变得更容易?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Community CDub    7 年前

    我建议你不要太多地分析你对这个问题的解决方案。 AppDomain.CurrentDomain.AssemblyLoad AppDomain.AssemblyResolve 用于在程序集解析或加载时运行代码的事件。

    另一个更优雅的解决方案可能是使用静态类型初始值设定项(静态构造函数)或 Module Initializers . 静态类型初始化器在第一次引用该类型时被调用,并且易于实现。然而, Module Initializers in C# 这不是一项微不足道的任务,但您可以通过实现来实现您的目标。