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

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

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

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


person James Kolpack    schedule 23.09.2010    source источник
comment
Вы всегда звоните из одного и того же домена приложения?   -  person Richard Cook    schedule 23.09.2010


Ответы (1)


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

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

person orka    schedule 23.09.2010
comment
То, что я искал, это инициализатор модуля, но нетривиальная реализация немного обломка. - person James Kolpack; 05.10.2010