2011-01-12 15 views
5

In Visual Studio 2010 ho la seguente layout del progetto:T4 riferimento blocchi di assemblaggio costruire

  • Soluzione
    • progetto Una classe C
    • classe D
  • progetto
    • B
      • template T4

Il modello T4 contiene un riferimento complesso così:

<#@ assembly name="$(SolutionDir)\A\bin\Debug\A.dll" #> 

Il modello crea un'istanza un'istanza di classe C. Quando si esegue il modello T4 processore carica la DLL del progetto A e crea correttamente l'output. L'errore si verifica quando voglio cambiare qualcosa nel progetto A, dire modificare sia di classe C o D.

Impossibile copiare il file "obj \ Debug \ A.dll" a "bin \ Debug \ A.dll ". Il processo non può accedere al file "bin \ Debug \ A.dll" perché è utilizzato da un altro processo.

L'unico modo per eliminare questo errore è riavviare Visual Studio. C'è un altro modo per forzare lo scarico dell'assembly A.dll da VS?

risposta

8

Im usando VS2010 SP1 ed era ancora ottenere bloccato durante la costruzione dopo la prima compilazione quando si esegue un modello T4 personalizzato durante gli eventi POST-BUILD che hanno accesso a istanze di classi dello stesso progetto.

Come ho avuto modo di funzionare è stato quello di utilizzare Reflection per accedere alle classi dalla DLL del progetto.

Ho ancora il problema del blocco durante il caricamento della DLL direttamente dal file.

NOTA: Il trucco consisteva nel caricare la DLL nella memoria come una matrice di byte e quindi caricare l'assembly dalla matrice di byte non elaborati. NON caricare dal file utilizzando Assembly.LoadFrom

Questo codice proviene dal file modello T4 e accede a una classe statica "Informazioni" e chiama un metodo statico "Versione" per restituire un valore stringa.

string assemblyPath = Path.Combine(projectPath, @"bin\SampleProject.dll"); 
byte[] data; 

using (var fs = File.OpenRead(assemblyPath)) 
{ 
    data = new byte[fs.Length]; 
    fs.Read(data, 0, Convert.ToInt32(fs.Length)); 
} 

if (data == null || data.Length == 0) 
{ 
    throw new ApplicationException("Failed to load " + assemblyPath); 
} 

var asm = Assembly.Load(data); 
appVersion = (string) asm.GetType("SampleProject.Information").GetField("Version").GetValue(null); 
+0

Great Answer! Ma quando ottengo l'assembly tramite un array di byte per qualche motivo, perdo tutti gli attributi negli oggetti nella DLL .. qualcun altro ha eseguito in esso? – Nemmy

2

m0sa Questo problema è stato corretto in Visual Studio 2010 SP1.

Se non siete in grado di utilizzare questo, c'è una direttiva VolatileAssembly add-on nel progetto T4 Toolbox sul CodeBox (http://t4toolbox.codeplex.com/)

+0

Utilizzo Visual Studio 2010 SP1, ma continuo a riscontrare lo stesso problema. Per risolvere il problema [il mio problema] (http://stackoverflow.com/questions/5886938/cannot-reference-dependency-assemblies-in-t4-template-when-using-transformonbuild) Sto usando un percorso assoluto nell'assemblaggio 'direttiva.Qualche idea di cosa potrebbe essere sbagliato? –

+0

Ho paura di no - o test sulla correzione SP1 non ha mostrato alcun problema. Se è possibile sollevare un problema di connessione con un caso riprovevole, possiamo dare un'occhiata a questo. – GarethJ

+7

Ho lo stesso problema in Visual Studio 2013. –

Problemi correlati