2016-04-12 12 views
10

Così oggi ho affrontato un problema interessante mentre cercavo di costruire la nostra soluzione aziendale e volevo chiederti ragazzi sapete perché sta succedendo questo. Mi è stato detto che potrebbe provenire dalla mia macchina/studio visivo perché le altre persone non hanno avuto lo stesso problema.La chiamata di accesso membro non viene compilata, ma la chiamata statica fa

Così abbiamo un metodo di progetto A:

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer) 
{ 
    string queueName = typeNameSerializer.Serialize(messageType); 

    return messageType.GetAttribute<GlobalRPCRequest>() != null || AvailabilityZone == null 
     ? queueName 
     : queueName + "_" + AvailabilityZone; 
} 

dove GetAttribute<GlobalRPCRequest>() è definito in public static class ReflectionHelpers

public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute; 

allora abbiamo progetto B che hanno metodo:

public static string GetAttribute(this XElement node, string name) 
{ 
    var xa = node.Attribute(name); 
    return xa != null ? xa.Value : ""; 
} 

I devo indicare o Se si fa riferimento al progetto B nel progetto A. Ora quello che succede è che quando provo a costruire ottengo errore di compilazione: (! A mio parere)

Error 966 The type 'System.Xml.Linq.XElement' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. D:\Repositories\website\website\submodules\core\src\A\Extensions\Extensions.cs 37 13 A

Che cosa sta accadendo è che il compilatore pensa che sto effettivamente usando GetAttribute metodo dal progetto B. Perché questo sta accadendo? Da quando provo a navigare su GetAttribute VS mi conduce al metodo giusto (quello che è in ReflectionHelpers). Potrebbe essere a causa del riflesso? NOTA:: Ho risolto il problema chiamando il metodo in modo statico o aggiungendo il riferimento a System.Xml.Linq nel mio progetto A, ma sono curioso dello strano comportamento di VS/sintassi.

+0

Stai riferimento al assembly contenente XElement? Perché ti dice che il problema è questo? nessun nome di metodo menzionato. Voglio dire, hai provato ad aggiungere System.xml.linq? –

+0

Sì, ho provato questo in realtà risolvere il problema, ma come ho detto abbiamo trovato la soluzione di questo, ma lo strano comportamento rimane e mi sono incuriosito. Inoltre aggiungendo il riferimento a 'System.XML.LINQ' risolve il problema, ma è strano che il compilatore venga confuso prima di quella causa è ovvio (beh forse non è così ovvio per lui) che non uso alcun XElements. – kuskmen

+0

Ma lo fai nel progetto B? –

risposta

0

Direi che è in corso:
- B ha riferimento al System.Xml.Linq
- B è costruito senza un problema.
- Si fa riferimento B in A
- A non ha un riferimento a System.Xml.Linq
- Un sembrano consumare la funzione definita in B
- Quando si tenta di costruire il progetto A, Produce quell'errore

Ho ragione?

Se è così, è del tutto normale. Poiché un progetto che utilizza un riferimento (A) deve avere un riferimento a ciò che viene fatto riferimento (System.Xml.Linq) in base a ciò che fa riferimento (B).

Pensa in questo modo: quando si tenta di aggiungere un pacchetto nuget al progetto se ha una dipendenza, anche nuget lo installerà. Perché? A causa di questa situazione.

Questo è del tutto normale se comprendo correttamente la risposta.

+0

La domanda è stata la ragione per cui il compilatore si è confuso che utilizzerà la funzione nel progetto B quando la navigazione dello studio visivo sa chiaramente qual è il metodo giusto (quello nel progetto A)? Quando rispondi a questa risposta troverai la risposta alla risposta originale del post, almeno così ho capito. Controlla il link nei commenti sotto la mia domanda, rispondo praticamente a tutto quello che chiedo e mi chiedo. – kuskmen

+0

hahaha! scusa per il mio pessimo inglese (sia per la mia risposta che per la mia confusione). Hai avuto ragione di farlo :-) – zokkan

+0

A proposito, quale versione di vs stai usando? – zokkan

1

E 'una supposizione, ma credo che la vostra funzione:

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer) non corrisponde il tuo metodo di supporto firma perché si tenta restituendo una stringa:

public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute; che prevede un tipo di ritorno TAttribute.

Forse, puoi provare a modificare la funzione RpcRoutingKeyNamingConvention per restituire GlobalRPCRequest e verificare se il compilatore continua a impazzire.

+0

'non corrisponde alla firma del metodo helper perché si prova a restituire una stringa:' cosa vuoi dire che non corrisponde al mio metodo helper perché sto cercando di restituire una stringa .. questo è scandaloso per lo stato? – kuskmen

+0

@Yann REANAUDIN Non sta cercando di restituire una stringa, guarda '? queueName: queueName + "_" + AvailabilityZone; ' – Tokk

1

Visual Studio si confonde tutte le volte! Ho provato a riprodurre lo scenario nel mio VS 2015 (.NET 4.6) e compila bene. Non ho dovuto aggiungere riferimento a System.Xml.Linq nel mio progetto A.

La mia ipotesi è che potrebbe essere un problema di cache. Si potrebbe desiderare di provare questo:

  1. Rimuovere il riferimento al progetto B
  2. Clean poi ricostruire entrambe le soluzioni
  3. aggiungere il riferimento posteriore
  4. Ricostruire e voilà !! Beh .. si spera

Speranza che aiuta, fatemi sapere :)

Problemi correlati