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

时间:2010-09-23 02:45:26

标签: c# .net dynamic-loading assembly-attributes

我正在使用第三方库,它需要在使用静态方法之前调用它 - 它设置串行密钥以验证软件的许可证。我需要在多个项目中使用这个库,我想要保护这些项目不必担心这个许可证。理想情况下,我想创建一个共享程序集,它将处理许可并由使用该库的项目引用它 - 并且即使知道正在进行任何许可,也要隔离这些项目。

开始考虑实现这一点的一种方法是使用汇编属性。所以,我创建了一个具有构造许可证的构造函数:

[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中包含该属性,并且将调用该属性。这比将许可重新分配给所有下游项目要好,但他们仍需要额外的工作才能使其发挥作用。

此外 - 一些项目是动态加载的其他软件。例如:

Assembly.Load("LibraryUserProject.dll");

如何在动态加载包含的程序集时调用许可程序集属性?是否有其他.NET框架功能可以使这更容易?

1 个答案:

答案 0 :(得分:0)

如果没有太多分析问题的解决方案,我建议您在程序集解析或加载时检查AppDomain.CurrentDomain.AssemblyLoadAppDomain.AssemblyResolve事件以运行代码。

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