Я использую стороннюю библиотеку, для которой требуется статический метод, прежде чем он будет использован - он устанавливает серийный ключ для проверки лицензии на программное обеспечение.Мне нужно использовать эту библиотеку в нескольких проектах, и я хочу защитить эти проекты от необходимости беспокоиться об этой лицензии.В идеале я хотел бы создать общую сборку, которая будет обрабатывать лицензирование и ссылаться на него в проектах, использующих библиотеку, - и изолировать эти проекты даже от осознания того, что какое-либо лицензирование выполняется.
Один из способовначать думать о достижении этого, возможно, использовать атрибут сборки.Итак, я создаю тот, у которого есть конструктор для установки лицензии:
[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 Framework, которая могла бы сделать это проще?