Атрибуты сборки с динамически загружаемой сборкой

Я использую стороннюю библиотеку, для которой требуется статический метод перед его использованием - он устанавливает серийный ключ для проверки лицензии на программное обеспечение. Мне нужно использовать эту библиотеку в нескольких проектах, и я хочу защитить эти проекты от необходимости беспокоиться об этой лицензии. В идеале я хотел бы создать общую сборку, которая будет обрабатывать лицензирование и ссылаться на него в проектах, использующих библиотеку, и изолировать эти проекты от того, чтобы они даже знали, что какое-либо лицензирование имеет место.

Один из способов начать думать об этом, возможно, использовать атрибут сборки. Итак, я делаю тот, который имеет конструктор для установки лицензии:

[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, которая может сделать это проще?

1 ответ

Решение

Без особого анализа вашего решения проблемы, я предлагаю вам проверить AppDomain.CurrentDomain.AssemblyLoad а также AppDomain.AssemblyResolve события для запуска вашего кода, когда сборка разрешена или загружена.

Другим и более элегантным решением может быть использование инициализаторов статического типа (статического конструктора) или инициализаторов модулей. Инициализаторы статического типа вызываются при первом обращении к типу и легко реализуются. Однако инициализаторы модулей в C# не являются тривиальной задачей, но вы можете достичь своей цели, внедрив ее.

Другие вопросы по тегам