我正在使用第三方库,它需要在使用静态方法之前调用它 - 它设置串行密钥以验证软件的许可证。我需要在多个项目中使用这个库,我想要保护这些项目不必担心这个许可证。理想情况下,我想创建一个共享程序集,它将处理许可并由使用该库的项目引用它 - 并且即使知道正在进行任何许可,也要隔离这些项目。
开始考虑实现这一点的一种方法是使用汇编属性。所以,我创建了一个具有构造许可证的构造函数:
[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框架功能可以使这更容易?
答案 0 :(得分:0)
如果没有太多分析问题的解决方案,我建议您在程序集解析或加载时检查AppDomain.CurrentDomain.AssemblyLoad
和AppDomain.AssemblyResolve
事件以运行代码。
另一个更优雅的解决方案可能是使用静态类型初始化器(静态构造函数)或Module Initializers。静态类型初始化器在第一次引用类型时被调用,并且易于实现。但是,Module Initializers in C#不是一项微不足道的任务,但您可以通过实施来实现目标。