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