2010-10-17 4 views
12

Interfaces (Nell'assemblea denominata "Interfacce" In progetto: -. Interfaces)Application Block Unità 2.0 - Il nome delle istruzioni riportate o codebase non era valido

namespace Interfaces 
{ 
    public interface IDoSomeWork1 
    { 
     string DoSomeWork1(); 
    } 
} 

namespace Interfaces 
{ 
    public interface IDoSomeWork2 
    { 
     string DoSomeWork2(); 
    } 
} 

dipendenze (nell'Assemblea denominata "Entità " In progetto: -. Entità)

namespace Entities 
{ 
    public class ClassB : IDoSomeWork1 
    { 
     public string DoSomeWork1() 
     { 
      return this.ToString(); 
     } 
    } 
} 

namespace Entities 
{ 
    public class ClassC : IDoSomeWork2 
    { 
     public string DoSomeWork2() 
     { 
      return this.ToString(); 
     } 
    } 
} 

Class (In progetto: - UsingUnity)

public class ClassA 
    { 
     [Dependency] 
     public IDoSomeWork1 DoSomeWork1 { get; set; } 
     [Dependency] 
     public IDoSomeWork2 DoSomeWork2 { get; set; } 


     public void SomeMethodInClassA() 
     { 
      Console.WriteLine(DoSomeWork1.DoSomeWork1()); 
      Console.WriteLine(DoSomeWork2.DoSomeWork2()); 
     } 
    } 

app.config (In un progetto di applicazione di console: - ConsoleUsingUnity)

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="unity" 
       type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, 
        Microsoft.Practices.Unity.Configuration" /> 
    </configSections> 
    <unity> 
     <containers> 
      <container> 
       <types> 
        <type type="Interfaces.IDoSomeWork1, Interfaces" 
          mapTo="Entities.ClassB, Entities" /> 
        <type type="Interfaces.IDoSomeWork2, Interfaces" 
          mapTo="Entities.ClassC, Entities" /> 
       </types> 
      </container> 
     </containers> 
    </unity> 
</configuration> 

Il client (In un progetto di applicazione di console: - ConsoleUsingUnity)

public class Class1 
    { 
     static void Main(string[] args) 
     { 
      IUnityContainer container = new UnityContainer(); 

      // Load from config file 
      UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 
      section.Configure(container); 

      ClassA classA = container.Resolve<ClassA>(); 
      classA.SomeMethodInClassA(); 
     } 
    } 

E quando eseguo il client, ottengo il seguente errore in section.Configure (container): -

Il nome dell'assembly o codice base specificato non era valido. (Eccezione da HRESULT: 0x80131047)

io non so se ci sia qualcosa di sbagliato con la configurazione o il tipo. Qualcuno potrebbe indicare l'errore qui?

risposta

14

Prima di rispondere alla mia domanda, devo dichiarare che il codice pubblicato sopra non mi ha dato alcun problema (errore di compilazione ecc.). Mi ha appena dato l'errore che ho affermato nella mia domanda. Il problema con Unity in questo momento è che non fornisce quale assembly o quali tipi nell'assembly non possono essere caricati. Questo è un requested feature.

Nel mio caso Si trattava di un problema di assemblaggio mancante. Non ho fatto riferimento all'assembly Entities nel progetto dell'applicazione client. Sembra che l'assembly "Entities" possa essere risolto solo in fase di esecuzione (poiché non mi ha dato alcun errore in fase di compilazione). Tuttavia, anche l'errore di runtime non era affatto utile.

Ho dato un'occhiata a Fusion Log viewer (Dovrebbe essere nella cartella .NET SDK). Che gemma di un'utilità Lo è. È in grado di registrare tutti i tipi di associazioni di assembly (tutti o solo i guasti) e fornisce una descrizione molto precisa di quale assembly non può essere caricato. Molto utile! FailedToLoadAssemblyDetected

Log

Così, la prossima volta, si ottiene questo "Il nome dato montaggio o codebase era valido" errore, provare Fusion Log Viewer. Non ti aiuterà a trovare quali tipi non possono essere caricati. Tuttavia, almeno sarai sicuro che tutti i tuoi assiemi verranno caricati correttamente.

+4

Purtroppo ho questo stesso problema, ottenere lo stesso messaggio di errore, ma il registro Fusion non mostra eventuali errori :( – CodingWithSpike

+3

assicurarsi che sia mostrando qualcosa! Può essere un po 'noioso per impostare e il processo che è necessario vedere il caricamento degli assembly deve essere riavviato dopo l'applicazione delle impostazioni in FusionLog. –

6

Se si connette l'evento dominio AssemblyResolve è possibile ottenere l'assembly che non è riuscito a eseguire il binding.

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
0

ho scoperto che il minor tempo metodo di trovare che Type non è riuscito esattamente a legare il consumo è la seguente: la sezione

  1. consultare le fonti pagina dell'Unità a CodePlex http://unity.codeplex.com/SourceControl/list/changesets
  2. Seleziona una versione e scarica le fonti
  3. Crea DEBUG versione di Unity e Unity.Configuration (se il progetto utilizza più unità di assemblaggio, costruisci pure)
  4. rimuovere i riferimenti a unità dal progetto e aggiungere i riferimenti agli assembly dal passo 3
  5. In Visual Studio andare a Debug > Exceptions e assicurarsi Common Language Runtime Exceptions ha una casella di controllo nella colonna Thrown.

Ora vai a fare quella cosa. L'esecuzione si fermerà nel metodo TypeResolverImpl.SearchAssemblies di Unitys e il parametro typeNameOrAlias manterrà la risposta!

+0

È necessario installare l'assembly nel GAC per configurarlo in app.config? Come fa .net so dove cercare? – Arcadian

3

C'è un modo migliore ora! Unity ha una nuova versione (attualmente 2.1.505.2) che riporta in modo chiaro i dettagli e ti consente di andare immediatamente al fondo.

Potete trovare i binari e fonte qui: http://unity.codeplex.com/releases

+0

Sono su Unity 2.1.5 e sto ancora ricevendo questo errore senza dettagli e nessuna registrazione Fusion con una libreria C++/CLI 'Mixed Mode'. – MultiMat

0

Si prega di assicurarsi, di aver aggiunto i riferimenti di assemblaggio del gruppo mancante nel progetto in cui esiste il file web.config.

Mi mancava questo. Ho già aggiunto questi riferimenti all'assembly nel progetto che utilizzava Unity per risolvere la classe, ma mancava di aggiungerlo nel progetto principale in cui si trovava il file di configurazione. Questo ha risolto il mio problema.

18

Nel caso in cui qualcun altro abbia mai avuto lo stesso problema, stavo ricevendo questo errore ma avevo un problema leggermente diverso. Stavo cercando di caricare un assembly che evidentemente esisteva come la seguente:

Assembly.Load("C:\\Program Files\\MyProgram\\MyAssembly.dll"); 

Dopo un sacco di tentativi ed errori ho capito che non sono tenuti a passare il percorso e di certo non si dovrebbe includere .dll estensione. Il seguente problema risolto:

Assembly.Load("MyAssembly"); 

Speriamo che questo aiuti qualcun altro prima o poi!

+8

O r utilizzare 'Assembly.LoadFrom' con il percorso. –

+0

@RomanReiner mi ha salvato così tanto tempo! –

+0

@RomanReiner Grazie –

0

opere come questa

Dim dllData = System.IO.File.ReadAllBytes(dllFullPath) 
Dim asb As System.Reflection.Assembly 

asb = System.Reflection.Assembly.Load(dllData) 

Dim cls As Object = asb.CreateInstance("namespace.class") 
Problemi correlati