Domanda

Ho alcune librerie che utilizzo nel mio progetto che non sono firmate.Poiché la mia richiesta è fortemente firmata, anche le biblioteche devono esserlo.

Firmo queste librerie utilizzando:

"%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

Il problema è che tutti i metadati, come i numeri di versione, si perdono nella DLL ora firmata.Questo è un problema perché ora alcune dipendenze tra le librerie sono interrotte.Come posso conservare i numeri di versione senza ricorrere alla compilazione effettiva del codice sorgente di tali librerie?

AGGIORNAMENTO

In realtà è una particolare DLL che mostra questo problema e ho scoperto che è creata utilizzando ILMerge.Forse questo è la causa del problema.Giusto per essere chiari:la DLL prodotta da ILMerge dispone dei metadati corretti, solo dopo averla smontata e rimontata, i metadati scompaiono.

AGGIORNAMENTO 2

Ho aperto la DLL in Reflector e sembra che almeno il numero di versione sia ancora lì.Controllavo continuamente utilizzando la finestra di dialogo delle proprietà del file/scheda dettagli in Esplora risorse.Quindi immagino che sia invece il manifest a mancare.

È stato utile?

Soluzione

Mi chiedo perché questo accada.Ho una buona esperienza nella compilazione di andata e ritorno utilizzando ilasm e ildasm anche su assembly non firmati e firmati.Puoi verificare che l'output dei metadati di ILasm contenga ancora le informazioni sulla versione (in fondo all'ambito dell'assembly):

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

Ho appena controllato di nuovo, "funziona sulla mia macchina" (usando esattamente le stesse opzioni della riga di comando che hai usato tu).

Ciò che in realtà andrà perso è il VersioneFile attributo (quello che vedi in Windows Explorer quando passi il mouse sopra l'assembly.IL AssemblyVersion l'attributo è ancora presente e corretto.Potrebbe essere che stai confondendo le due cose?Solo il AssemblyVersion è importante per le informazioni vincolanti.Guarda questo Quindi posta per maggiori informazioni.

Spero di poterti aiutare, altrimenti dovresti fornire più contesto.

Altri suggerimenti

Se hai il codice sorgente, poi basta ricompilare le librerie con i nomi forti -. Smontaggio e rimontaggio di solito funziona abbastanza bene, ma è ancora un hack

Per mantenere le dipendenze tra le librerie di lavoro, è necessario aggiornare i riferimenti nel codice .il di utilizzare la chiave pubblica del gruppo che fanno riferimento, altrimenti si cercherà di fare riferimento a una versione non firmata del gruppo, e quindi non riuscire per caricarlo in fase di esecuzione.

È possibile farlo a mano, ma diventa molto noioso dopo 2 o 3 gruppi. Una soluzione rapida per questo è firmatario , che si occupa di un sacco di difficoltà per voi, e fa un grande lavoro -. di solito è abbastanza rapido e pulito

(nota che allo stato attuale è stato costruito contro una vecchia versione di .NET. Se si utilizza C # 4 / .NET 4 assemblee è necessario scaricare il codice sorgente, modificarlo a bersaglio .NET 4 e ricostruirlo per ottenere un signer.exe che si gestire correttamente NET 4 assembly).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top