Attributs Assemblée avec bien chargée Assemblée
-
04-10-2019 - |
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?
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.