2009-09-25 23 views
6

Ho un assemblaggio realizzato in un altro progetto (projA). Ora voglio importare questa DLL in un altro progetto (projB). Come posso raggiungere questo obiettivo? Questo è quello che ho provato (in projB).ASP.NET Come aggiungere assembly in web.config?

1 Inserire la DLL nella stessa dir del mio progetto. (Dir bin)

2 Nel web.config:

<assemblies> 
    <add assembly="projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
</assemblies> 

Questo è l'errore che ottengo:

Impossibile caricare il file o l'assembly 'proja, Version = 1.0.0.0, Culture = neutro, PublicKeyToken = 31bf3856ad364e35 'o una delle sue dipendenze. La definizione manifest di assembly individuato non corrisponde al riferimento all'assembly. (Eccezione da HRESULT: 0x80131040)

EDIT:

Il punto è che alla fine il riferimento assemblea deve me aggiunti dinamicamente

EDIT 2:

Il nome del gruppo (e namespace) sono memorizzato nel database. L'assembly fisico (dll) viene aggiunto (per installazione) in projB. Ora il codice in projB deve leggere il nome dell'assembly dal database e quindi aggiungere un riferimento alla dll che viene aggiunta dall'installazione.

+0

la modifica cambia radicalmente il domanda per la testa. –

risposta

7

Sono tutte le dipendenze di projA in projB? Di solito aggiungerei semplicemente un riferimento da un progetto a un altro se sono nella stessa soluzione.

Edit:

Se si desidera aggiungere un assembly dinamico allora forse un riferimento al servizio forse una cosa da considerare. Eseguendo il dumping nella DLL di projA nel cestino che non fornisce realmente tutte le DLL che potrebbe richiedere, ci sono quindi modi per legare le cose in modo che gli oggetti possano essere capiti attraverso i sistemi, come i servizi Web che usano XML per dare un esempio comune.

La mia domanda su come aggiungere un assembly in modo dinamico è da dove si otterrebbe e quella parte può essere automatizzata per far parte di projB in quanto è davvero la soluzione generale a questo tipo di problema.

Edit 2:

Come hai potuto ottenere tutte le dipendenze di proja? È possibile ottenerlo in modo che non dipenda da una serie di altre DLL che possono o non possono essere sul sistema che deve essere eseguito. Questo è ciò che ti dice l'errore, che esiste anche un projC di assembly che è richiesto. Si noti che questa aggiunta di assiemi può continuare per un lungo periodo se sono utilizzati molti livelli di dipendenze.

Riassumere la risposta: cosa avresti bisogno di fare riferimento per caricare projA in qualche nuovo progetto? Questo è il tuo problema che senza sapere come sono le dipendenze è piuttosto difficile rispondere direttamente.

+0

Il punto è che alla fine il riferimento all'assembly deve essere aggiunto dinamicamente – Martijn

+0

Mi dispiace per essere stato così confuso, ho modificato il mio post. Speriamo che questo lo renda più chiaro – Martijn

4

Non è necessario aggiungere nulla in Web.config se la DLL dell'assembly si trova nella cartella Bin - è necessario farlo solo se si fa riferimento a un assembly presente nel GAC.

Il messaggio di errore che si sta dicendo in pratica sta dicendo che l'assembly non può essere trovato nel GAC, presumibilmente perché non è lì!

+1

Il caricatore di assiemi cercherà prima nella cartella locale/bin, varie altre combinazioni di/bin/e nome assembly, cartelle framework, ecc prima di andare al GAC. –

+0

Vedere la mia modifica sul punto di partenza – Martijn

3

Non è necessario aggiungere manualmente il riferimento nel file web.config.Fare clic con il tasto destro del mouse sul progetto nella finestra Esplora soluzioni in Visual Studio e selezionare "Aggiungi riferimento". Vai alla scheda Sfoglia e trova la DLL che hai creato nell'altro progetto, selezionala e fai clic su OK. Facoltativamente, è possibile aggiungere il progetto A alla stessa soluzione del progetto B e quindi aggiungere il riferimento tramite la scheda Progetti della finestra Aggiungi riferimento.

+0

Vedere la mia modifica sullo startpost – Martijn

0

L'errore

manifesta definizione del montaggio situato non corrisponde al montaggio di riferimento.

suggerisce che è stata trovata una DLL ma non corrisponde alla versione o alla chiave pubblica. Vorrei suggerire un doppio controllo per assicurare che il riferimento all'assembly corrisponda alle informazioni sulla versione e che nessuna DLL rogue con i numeri di versione precedenti si trovi nei percorsi/bin o GAC

0

Beh, suppongo che in qualche modo dipenda da cosa stai pensando di fare una volta che hai caricato l'assemblea e cosa hai nell'assemblaggio.

Suppongo che tu abbia una sorta di architettura di plugin, con un'interfaccia o una classe base conosciute su cui chiamerai i metodi, diciamo IPlugin.

Comunque, ecco come caricare un assembly in modo dinamico, in base a memorizzare un riferimento ad essa sia in una sezione di configurazione o di una colonna DB da qualche parte:

private IPlugin LoadPlugin(string fullTypeName) { 
    Type type = Type.GetType(fullTypeName, false, true); 

    Object plugin = Activator.CreateInstance(type); 

    if (plugin is IPlugin) { 
    return (IPlugin) plugin; 
    } 

    // Handle the fact you've not got what you expected however you like 
    throw new ApplicationException(error); 
} 

Quindi questo richiederà una stringa come "projA.PluginClass, projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" carico del assemblaggio, e restituire un'istanza della classe che ti interessa

si potrebbe quindi usare in questo modo:.

// Call to DB to get details of class and assembly 
string pluginClass = GetPluginDetails(); 

IPlugin plugin = LoadPlugin(pluginClass); 

// Call known method to do something on IPlugin 
plugin.SomeMethod(); 
Problemi correlati