Comment pourrais-je signer fortement une DLL externe tout en conservant ses métadonnées d'assemblage?

StackOverflow https://stackoverflow.com/questions/3497455

  •  29-09-2019
  •  | 
  •  

Question

J'ai quelques bibliothèques j'utiliser dans mon projet qui ne sont pas signées. Parce que ma demande est fortement signé, les bibliothèques doivent être aussi bien.

Je signe ces bibliothèques en utilisant:

"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\ildasm.exe" /nobar /all /out=library.il library.dll
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe" /dll /key=MyKey.snk library.il

Le problème est que les métadonnées, telles que les numéros de version, se perdre dans la DLL maintenant signé. Ceci est un problème parce que maintenant certaines dépendances entre les bibliothèques sont brisées. Comment puis-je conserver les numéros de version sans avoir recours à la compilation en fait le code source de ces bibliothèques?

UPDATE

Il est en fait une DLL particulière qui montre ce problème et j'ai découvert qui est construit en utilisant ILMerge. Peut-être est à l'origine du problème. Pour être clair:. La DLL qui est produit par ILMerge ne les métadonnées proprement dit, seulement après les réassembler et désassemblage, les métadonnées disparaît

MISE À JOUR 2

J'ai ouvert la DLL dans le réflecteur et il semble qu'au moins le numéro de version est toujours là. Je vérifiais en utilisant les propriétés du fichier de dialogue / onglet détails dans l'Explorateur Windows tout le temps. Donc, je dis qu'il est le manifeste qui manque à la place.

Était-ce utile?

La solution

Je me demande pourquoi cela se produit. J'ai tout à fait une bonne expérience en aller-retour en utilisant la compilation ilasm et ildasm sur des ensembles non signés et signés de même. Pouvez-vous vérifier la sortie de métadonnées par ilasm contient encore les informations de version (en bas du champ de montage):

.assembly ConsoleApplication1
{
  //...
  .hash algorithm 0x00008004
  .ver 1:0:0:0
} 

Il suffit de vérifier à nouveau, il « fonctionne sur ma machine » (en utilisant les commutateurs commandline exactement le même que vous avez fait).

Qu'est-ce qui fait perdre est le AssemblyVersion attribut toujours présent FileVersion attribut (celui que vous voyez dans l'explorateur Windows en vol stationnaire au-dessus de l'assemblée. Et correct. pourrait-il vous confondez les deux? Seul le AssemblyVersion est important pour l'information obligatoire. Voir cette SO pour poster plus d'informations.

L'espoir que je pourrais aider, sinon vous auriez besoin de fournir plus de contexte.

Autres conseils

Si vous avez le code source, puis recompiler les bibliothèques avec des noms forts -. Et réassembler fonctionne désassemblage généralement assez bien, mais il est encore un hack

Pour conserver les dépendances entre les bibliothèques de travail, vous devez mettre à jour les références dans le code .il utiliser la clé publique de l'assemblée, ils font référence, sinon ils vont essayer de faire référence à une version non signée de l'assemblée, et donc l'échec pour le charger à l'exécution.

Vous pouvez le faire à la main, mais il est très fastidieux après 2 ou 3 ensembles. Une solution rapide pour cela est signeur, qui traite beaucoup des difficultés pour vous et fait un excellent travail -. il est généralement assez rapide et propre

(Notez que actuellement il a été construit contre une ancienne version .NET. Si vous utilisez C # 4 / .NET 4 ensembles vous aurez besoin de télécharger la source, changer pour cible .NET 4 et le reconstruire pour obtenir un signer.exe qui va gérer correctement 4 .NET ensembles).

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