Атрибуты сборки с динамически загружаемой сборкой - PullRequest
0 голосов
/ 23 сентября 2010

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

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

[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 Ответ

0 голосов
/ 23 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...