2009-09-30 7 views
14

Sto lavorando con un progetto molto grande (una soluzione che contiene 16 progetti e ogni progetto contiene circa 100 file).Come rimuovere risorse non necessarie dal mio progetto?

È scritto in C++/C# con Visual Studio 2005.
Uno dei progetti ha circa 2000 risorse, di cui solo 400 sono effettivamente utilizzate.
Come rimuovere le risorse inutilizzate?

Ho provato a eseguire l'operazione cercando quelli usati.
Ha funzionato e sono riuscito a creare la soluzione, ma si è rotto in fase di esecuzione.

Suppongo che vengano utilizzati enum s. (IMPORTANTE)

Come posso fare in modo che non si rompe in fase di esecuzione?

EDIT:
Credo che un metodo potrebbe essere quello di generare la risorsa (che non si trova) al volo in fase di esecuzione (in qualche modo).
Ma non ho idea di ... nulla.

NOTA: Va bene se alcune risorse non necessarie sono ancora presenti.

+1

Se si intende la pulizia del file resx, SharpDevelop ha questa caratteristica. (http://www.sharpdevelop.net) –

+0

funziona con C++? –

+0

Non chiamerei un sistema con 1600 file sorgente "molto grandi". Moderatamente, forse, ma non "molto grande". Aggiungi un altro zero e ti stai avvicinando a "molto grande". – JesperE

risposta

4

Quello che vorrei fare è scrivere uno strumento personalizzato per cercare il codice sorgente.

Se si rimuove un ID di risorsa da un file di intestazione (ad esempio chiamato resource.h) e quindi ricompilato e non si ricevono avvisi: allora questa è una buona cosa.

Ecco come vorrei scrivere l'app. Prendi come input il file di risorse (resource.h) che vuoi esaminare. Apri il file di intestazione (* .h) e analizza tutte le costanti di risorse (o almeno le forze a cui sei interessato). Salva quelli in una tabella hash per una rapida ricerca in seguito. Per ogni file di codice nel progetto, cercare nel testo le istanze di ciascun ID risorsa. Quando viene utilizzato un ID risorsa, incrementare il valore nella tabella hash altrimenti lasciarlo a zero. Alla fine, scaricare tutti gli ID delle risorse che sono a zero un file di registro o qualcosa del genere. Quindi prova che in effetti puoi rimuovere gli ID delle risorse specificate in modo sicuro. Dopo averlo fatto, scrivi un altro strumento che rimuove l'ID della risorsa specificato in base ai risultati del tuo file di registro.

Si potrebbe scrivere un tale strumento in perl e verrebbe eseguito in circa 0,3 secondi: ma ci vorrebbero giorni per eseguire il debug. :) Oppure potresti scrivere questo in.NET, e si eseguirebbe un po 'più lentamente, ma ti richiederebbe un'ora per eseguire il debug. :)

+1

Molto cool :-) + 1A –

0

Forse Find Unused Resources in a .NET Solution aiuta qui? Fondamentalmente, dovrai verificare quali risorse vengono utilizzate (ad es. Tramite controlli completi sulla copertura del codice) e rimuovere quelle non utilizzate.

E probabilmente non dovresti aver paura di utilizzare l'approccio trail-and-error per la pulizia.

+0

Ho fatto solo questo. Ma :( –

1

È possibile utilizzare plug-in di terze parti per Visual Studio come ReSharper. Questo componente aggiuntivo analizzerà il tuo codice C# e indicherà le risorse inutilizzate. Ma funziona solo con C#.

1

Per i progetti C++, consultare la sezione ResOrg da Riverblade.

"Il Resource ID Organizer (ResOrg in breve) è un componente aggiuntivo per Visual C++ progettato per aiutare a superare una delle più noiose (e inutili) faccende di sviluppo/mantenimento di applicazioni Windows - mantenimento dei valori di ID simbolo risorsa"

http://www.riverblade.co.uk/products/resorg/index.html

0

Nel Esplora soluzioni, fare clic destro e su un riferimento e fare clic sulla voce di menu Trova codice dipendente.

Se non è possibile trovare alcun codice dipendente, è possibile rimuovere questo riferimento dal progetto. (L'operazione Rimuovi si trova anche nel menu di scelta rapida.)

EDIT: per un grande progetto, l'operazione Trova codice dipendente vorrà molto tempo. Quindi, dal momento che hai 2000 risorse e molto probabilmente valore vostro tempo questo probabilmente è non una valida opzione ....

1

Non ho mai avuto uno così male. Il mio metodo nei programmi compilati consiste nell'utilizzare uno script REXX che emuli GREP alla ricerca di riferimenti alla fonte che sospetto non siano utilizzati, rimuoverli dal programma e vedere quali interruzioni. Io uso lo script REXX perché posso pre-filtrare l'elenco dei file che voglio cercare. Che mi permette di fare una ricerca tra cartelle e computer.

1

Si consiglia di dare un'occhiata allo strumento Reflector (gratuito), da non confondere con ReSharper (costoso). Può mostrarti quali DLL dipendono da un'altra. Quindi, se lo desideri, potresti essere in grado di rimuovere la DLL a cui non fa riferimento altro. Fai attenzione se stai usando un'iniezione di dipendenza o una riflessione che potrebbe infrangere il tuo codice a tua insaputa.

Riflettore: http://www.red-gate.com/products/reflector/.

Questo componente disegna grafici di dipendenza di assieme e grafici IL: http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph.

+1

Reflector non è più gratis (birra) – Bobby

1

Se il codice contiene il caricamento dinamico di risorse (ad esempio tramite stringhe) in fase di esecuzione, non è possibile determinare automaticamente quali risorse possono essere rimosse in modo sicuro dalla sorgente. Una dichiarazione di caricamento dinamico può caricare qualsiasi risorsa.

La soluzione migliore è iniziare con la versione ridotta dell'app, eseguirla e identificare quali risorse mancano durante il test. Quindi aggiungili nuovamente e riprova.

0

Per le risorse C++, hai provato a fare clic con il pulsante destro del mouse sul progetto in "Visualizzazione risorse" e poi a eliminare quelli che non hanno un segno di spunta accanto a essi? Non è sicuro eliminare le risorse di dialogo non utilizzate poiché vengono indicate come "enum" nel codice (come nel seguito).

enum { IDD = IDD_ABOUTBOX }; 

.. in ogni caso dovrebbe essere sicuro per tutti gli altri.

1

Nella "Visualizzazione risorse" di Solution Explorer, fare clic con il tasto destro del mouse e selezionare "Simboli risorse". Ora si ottiene una lista in cui è possibile vedere quali costanti di risorse vengono utilizzate nel file .RC. Questo aiuto potrebbe essere un po 'sul modo di ripulire il Resource.h (anche se non mostra quali risorse non sono utilizzate nel codice C++).

Problemi correlati