2011-04-12 3 views
39

J'ai le fichier licenses.licx qui est inclus dans l'une de mes propriétés de projets. Je ne suis pas sûr de savoir comment cela est utilisé par ses DLL. Est-il utilisé par msbuild? Avez-vous une idée de la façon dont il est utilisé lorsque la solution est en construction?Comment le fichier licenses.licx est utilisé

+1

duplication possible de [Comment fonctionne le modèle de licence de composant .Net basé sur Licences.licx?] (Http://stackoverflow.com/questions/51363/how-does-the-licenses-licx-based-net -component-licensing-model-work) – R0MANARMY

+1

@ROMNANARMY: J'ai parcouru ce fil. Cela ne me fournit pas ce que je cherche. Je veux juste savoir comment fonctionne licenses.licx en général. – CharithJ

Répondre

14

Licenses.licx file woes

Fichier cette sous ASP.NET, Département de la WTF. Frustration Lorsque vous développez une application Web avec nos commandes , un fichier mystérieux appelé licenses.licx apparaît. Non, ce n'est pas un ordre d'utiliser une sucette nommée bizarrement, mais un fichier de transition généré (et modifié) par Visual Studio qui participe à la vérification de la licence . En mode Création, Visual Studio utilise ce fichier pour créer une note de de chaque contrôle sous licence que vous utilisez dans votre conception. Lorsque vous compilez votre application, Visual Studio lit ce fichier licenses.licx et pour chaque contrôle mentionné ici, charge l'assembly correspondant et exécute le code de licence dans cet assembly pour voir si l'assembly est correctement sous licence (c'est-à-dire , que le produit auquel il appartient a été correctement installé sur cette machine). Si tout se vérifie, Visual Studio intègre la clé de licence dans l'exécutable. Si ce n'est pas, vous obtiendrez des messages d'erreur étranges sur le contrôle ne pas être sous licence (mon préféré est "Impossible de transformer le fichier de licences 'licenses.licx' en une ressource binaire." À laquelle j'appelle habituellement le coloré langue de mes ancêtres).

Licences.licx est en fait un fichier dans votre solution (si vous ne pouvez pas voir là, cliquez sur Afficher tous les fichiers). Visual Studio utilise un programme appelé lc.exe pour compiler les licences dans les ressources intégrées dans votre application , et lorsque les choses tournent mal avec la compilation de la licence, j'ai vu des messages d'erreur qui font également référence à cet exécutable.

Voici un exemple de ligne dans un fichier licenses.licx.

DevExpress.XtraCharts.Web.WebChartControl, DevExpress.XtraCharts.v8.2.Web, Version = 8.2.4.0, Culture = neutral, PublicKeyToken = 9b171c9fd64da1d1

La première valeur dans cette liste délimitée par des virgules est la classe, la deuxième est l'assembly où il est trouvé, et les autres valeurs sont le reste de le nom fort de l'assembly. Je suis sûr que vous pouvez déjà voir des problèmes, en particulier lorsque vous mettez à niveau une solution vers les dernières versions des contrôles tiers que vous utilisez. Si vous le souhaitez, vous pouvez modifier ce fichier et supprimer les parties de nom fort sans problème.

Mais ce n'est pas le plus gros problème avec licenses.licx. La chose est Visual Studio a une propension à toucher ce fichier si vous ouvrez la solution (c'est "toucher" comme en changeant la date du fichier à la date/heure actuelle ). Cela fait des ravages avec les licences, surtout si vous ouvrez la solution sur une machine sans licence et que vous utilisez le contrôle de source . Soudain, votre machine de construction va se débarrasser de ces messages "ne peut pas transformer" et vous vous demandez ce qui n'a pas fonctionné. Un autre problème prévalent lorsque vous avez une équipe de développeurs travaillant sur une solution: ils modifient tous inconsciemment ce fichier. Donc, la réponse semble être de ne pas mettre le fichier licenses.licx sous le contrôle de source . (KB article)

Mais cette solution au problème jette un autre drapeau rouge: si l'un des les développeurs dans une équipe ajoute un nouveau contrôle qui a besoin de licence pour la forme, une ligne est ajoutée à son dossier licenses.licx locale et peut ne pas se refléter dans le contrôle de la source. Bam, votre machine de construction échoue la construction et Joe, qui a ajouté le contrôle, doit acheter des beignets pour l'équipe jusqu'à ce que quelqu'un d'autre casse la construction. Je crains de ne pas avoir de bonne solution à ce dernier problème, car malheureusement le "ne pas mettre licenses.licx dans le contrôle de source" semble être la façon dont tout le monde résout le problème de licence. Une autre solution est de supprimer complètement le fichier licenses.licx et d'obtenir Visual Studio pour le régénérer en ouvrant la solution (bien que ce soit un peu difficile sur une machine de build). Quoi qu'il en soit, espérons que tout cela aidera d'une manière ou d'une autre. Et en frappant votre ordinateur portable avec un téléphone ne va pas vraiment aider.

25

Puisque vous indiquez que StellarEleven's reply n'aide pas, je suppose que vous cherchez quelque chose d'encore plus simple. Ce n'est probablement pas 100% correct, mais je comprends comment cela fonctionne:

Le fichier licx est simplement une liste des composants "sous licence" utilisés par votre application.

Chaque ligne du fichier est au format suivant:

[Component Name], [Assembly Name] 

Par exemple, un de mes projets utilise le composant sous licence Works IP NetDial donc mon fichier .licx contient la ligne suivante:

nsoftware.IPWorks.Netdial, nsoftware.IPWorks 

Dans le contexte du fichier de projet (.csproj), le fichier .licx est référencé comme EmbeddedResource. Au cours du processus de génération, LC.exe vérifie que la machine effectuant la génération possède les licences appropriées pour le composant en question et génère un fichier .licenses binaire qui est finalement incorporé en tant que ressource ([NomModule] .exe.licenses) dans l'exécutable final.

Est-ce que cela aide?

+2

Avez-vous une idée de la façon dont LC.exe vérifie que la machine possède la licence appropriée? J'ai publicKeyToken dans le fichier de licence. Est-ce ce que LC.exe utilise pour vérifier? Je vous remercie! – CharithJ

+4

Je ne pense pas. Je crois que le publicKeyToken dont vous parlez est utilisé pour s'assurer que l'assembly référencé n'a pas été falsifié. Le mécanisme que LC utilise est celui décrit dans l'autre réponse à cette question - en particulier l'attribut LicenseProvider pour le composant (le cas échéant) est localisé, puis interrogé (un appel est fait à GetLicense) via la réflexion.Si je comprends bien (et je ne peux pas), l'objet Licence retourné à partir de cet appel est ensuite sérialisé dans le fichier .licenses. –

+2

Malheureusement, étant donné que le LicenseProvider est accessible par réflexion, chaque composant sous licence peut (et très probablement) utiliser son propre mécanisme pour déterminer l'état de la licence sur la machine de construction. –

Questions connexes