Question

J'utilise une bibliothèque 3ème partie qui nécessite une méthode statique pour être invoquée avant qu'il ne soit utilisé - il définit la clé de série pour valider la licence du logiciel. Je besoin d'utiliser cette bibliothèque dans plusieurs projets et je veux protéger ces projets d'avoir besoin de vous soucier de cette licence. Idéalement, je voudrais créer un assembly partagé qui se chargera de l'octroi de licences et de référence par les projets qui utilisent la bibliothèque -. Et d'isoler ces projets de même en sachant que toute licence aura lieu

Une façon de commencer à penser à y parvenir est d'utiliser peut-être un attribut d'assemblage. Alors, je fais un qui a un contructor pour définir la licence:

[AttributeUsage(AttributeTargets.Assembly)]
public class LibraryLicenseAttribute : Attribute
{
  public LibraryLicenseAttribute()
  {
    Lib.SetLicense("valid key");
  }
}

et placez-le dans un projet d'emballage:

LibraryWrapperProject
  Properties
    AssemblyInfo.cs
  References
    Lib.dll
  LibraryLicenseAttribute.cs

Et l'ont invoqué en l'incluant dans AssemblyInfo.cs:

[LibraryLicense]

Maintenant, je peux faire référence à ce projet dans un autre projet qui utilise la bibliothèque:

LibraryUserProject
  References
    LibraryWrapperProject
  LibraryUser.cs

... mais quand je vais utiliser la bibliothèque ...

class LibraryUser
{
  public LibraryUser()
  {
    Lib.Use();
  }
}

Il indique que la licence n'a pas été fixée. J'ai trouvé que je peux inclure l'attribut dans les AssemblyInfo.cs du projet appelant et l'attribut obtiendrai invoqué. Cela vaut mieux que la redistribution des licences à tous les projets en aval, mais ils ont encore besoin que cruft supplémentaire pour le faire fonctionner.

En outre - certains des projets sont chargés dynamiquement elseware. Par exemple:

Assembly.Load("LibraryUserProject.dll");

Comment puis-je invoquer l'attribut d'assemblage de licence lors du chargement dynamique, il est l'assemblage contenu dans? Y at-il une autre caractéristique de .NET Framework qui pourrait vous faciliter la tâche?

Était-ce utile?

La solution

Sans beaucoup l'analyse de votre solution au problème, je vous suggère de vérifier les événements AppDomain.CurrentDomain.AssemblyLoad et AppDomain.AssemblyResolve pour exécuter votre code lorsque l'ensemble résolu ou loadded.

Une autre solution plus élégante et peut être en utilisant un initializers de type statique (constructeur) ou statique Module Initialiseur . intitializers de type statique sont appelés la première fois le type est référencé et à mettre en œuvre facile. Cependant, Module Initialiseur en C # n'est pas une tâche triviale mais vous pouvez achive votre objectif en mettant en œuvre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top