0

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

开始考虑完成此操作的一种方法可能是使用程序集属性。因此,我制作了一个具有设置许可证的承包商:

[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 框架功能可以使这更容易?

4

1 回答 1

0

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

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

于 2010-09-23T03:52:36.947 回答