2013-01-24 9 views
10

Sto cercando qualcosa esplorativo:È possibile unire solo un sottoinsieme di dipendenze usando ILMerge?

dire che ho un "coolproject" biblioteca e ha dipendenze per one.dll, two.dll e three.dll.

Desidero utilizzare ILMerge per combinare coolproject con one.dll e two.dll ma NON three.dll. Al termine della fusione, dovrei avere coolproject.dll e three.dll. Ovunque intenda utilizzare coolproject.dll Devo anche fare riferimento a three.dll

È possibile? Ogni volta che ci provo, ottengo. Unresolved assembly reference not allowed: three. Sto omettendo three.dll impostando "Copia locale" = falso.

[EDIT]:

eseguiti come il seguente:

ILMerge /targetplatform:v2 /log /internalize /out:bin\coolproject.dll obj\Debug\coolproject.dll C:\Users\Nick\Projects\test\bin\one.dll C:\Users\Nick\Projects\test\bin\two.dll 
+0

Come stai chiamando ILMerge? Il messaggio di errore è corretto IIRC, hai bisogno di 'three.dll' lì (o da qualche altra parte dove ILMerge può vederlo), ma questo non significa automaticamente che sia unito. – hvd

+0

È per un progetto WPF? –

+0

@Bob questa è una libreria C# standard. – NickSuperb

risposta

7

Il motivo per cui non funziona è piuttosto semplice: ILMerge deve essere in grado di individuare la dll che è stata omessa dall'elenco.

Quando si valutano le dipendenze nella libreria di destinazione, ILMerge controlla per impostazione predefinita varie posizioni per identificare la libreria dipendente (\ bin, GAC, ecc.) Anche se l'omissione dall'elenco della riga di comando. Se non è in grado di individuare questa libreria, è necessario specificarne la posizione utilizzando lo switch \lib. Altrimenti vedrai l'errore Unresolved assembly reference not allowed: three.

Esempio:

ILMerge /lib:..\three\bin\three.dll /targetplatform:v2 /log /internalize /out:bin\coolproject.dll obj\Debug\coolproject.dll C:\Users\Nick\Projects\test\bin\one.dll C:\Users\Nick\Projects\test\bin\two.dll 
+0

Ciò lascia tre.dll come riferimento esterno nella DLL unita o lo interiorizza anche? Grazie. – Mightymuke

+0

Ciò comporta che three.dll è un riferimento esterno che era l'intento in questo caso. Questa potrebbe anche essere una soluzione last-ditch per digitare e errori di collisione nello spazio dei nomi per gli assembly internalizzati. – NickSuperb

+1

Se provo a specificare una DLL nell'argomento/lib:, ILMerge fallisce con "Directory di ricerca specificata" C: \ a \ b \ c.dll "non trovata." –

-2

credo che tu stia cercando il parametro 'escludere' per l'interruttore /internalize. Ad esempio, se si utilizza

/internalize:excludes.txt 

cui il file contiene excludes.txt

three.dll 

sarà interiorizzare one.dll e two.dll ma lasciare three.dll come dipendenza esterna.

Qui ci sono un paio di post di blog che vanno in ulteriori dettagli:

Update: Dal documentation:

2,10 ExcludeFile

public string ExcludeFile {get; impostato; }

Questa proprietà viene utilizzata solo in combinazione con la proprietà Internalize (Sezione 2.12). Quando viene impostato prima di chiamare Unisci, indica il percorso e il nome file che verranno utilizzati per identificare i tipi che non devono avere la loro visibilità modificata. Se Internalize è true, ma ExcludeFile è "", tutti i tipi in qualsiasi assembly diverso dall'assembly principale vengono resi non pubblici. L'impostazione di questa proprietà imposta implicitamente Internalize su true.

Il contenuto del file deve essere un'espressione regolare per riga. La sintassi è quella definita nello spazio dei nomi .NET System.Text.RegularExpressions per le espressioni regolari. Le espressioni regolari sono abbinate al nome completo di ciascun tipo, ad esempio "System.Collections.IList". Se la corrispondenza fallisce, viene tentata nuovamente con il nome dell'assembly (circondato da parentesi quadre) anteposto al nome del tipo. Pertanto, il modello "[A]. *" Esclude tutti i tipi nell'assembly A dall'essere resi non pubblici. (Le barre retroverse sono obbligatorie in quanto la stringa viene trattata come un'espressione regolare.) Il pattern "N.T "corrisponderà a tutti i tipi denominati T nello spazio dei nomi denominato N indipendentemente dall'assieme in cui sono definiti.

È importante notare che le espressioni regolari non sono ancorate all'inizio della stringa; se lo si desidera, utilizzare i caratteri operatore di espressioni regolari appropriate per farlo.

2.12 interiorizzare

public bool interiorizzare {get; impostato; }

Questo controlla se i tipi negli assiemi diversi dall'assieme primario hanno la loro visibilità modificata. Quando è vero, tutti i tipi non esenti che sono visibili al di fuori dell'assieme hanno la loro visibilità modificata in modo che non siano visibili dall'esterno dell'assieme unito. Un tipo è esente se il suo nome completo corrisponde a una riga di ExcludeFile (sezione 2.10) che utilizza il motore di espressioni regolari .NET.

+0

Vorrei che l'elettore avesse lasciato un commento. Questo è quello che faccio con il mio progetto e funziona bene, non so quale sia il problema qui. – Mightymuke

+0

Non sono sicuro che il problema non riguardasse la visibilità degli elementi uniti ma piuttosto l'inclusione "fisica" di quell'elemento nell'assieme. Come le opzioni internalize ed exclude non sono rilevanti. – NickSuperb

0

Ho scritto un piccolo strumento per affrontare questo.

Il codice sorgente può essere trovato @https://github.com/leppie/ReferenceRemover.

In te caso sarà utilizzato come:

ReferenceRemover three.dll "(one|two).*" coolproject.dll 

Spiegazione di args:

  1. Assemblea di ispezionare
  2. Regex per abbinare i riferimenti
  3. L'assemblea ha bisogno di reindirizzare a

L'output è three.dll con i suoi riferimenti adeguati.

Problemi correlati