2011-01-12 7 views
5

In Visual Studio 2010 Ich habe folgendes Projekt-Layout:T4 referenzierte Assembly Blöcke bauen

  • Lösung
    • Projekt A
      • Klasse C
      • Klasse D
    • Projekt B
      • T4 template

Die T4-Vorlage enthält eine Montagebezugs wie folgt aus:

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

Die Vorlage eine Instanz der Klasse C. instanziiert Wenn ich die T4-Vorlage der Prozessor ausführen lädt die DLL des Projekts A und erstellt die Ausgabe korrekt. Der Fehler tritt auf, wenn ich etwas in Projekt A ändern möchten, sagen entweder Klasse C oder D. ändern

Kann Datei "obj \ Debug \ A.dll" auf „bin \ Debug kopieren \ A.dll ". Der Prozess kann nicht auf die Datei 'bin \ Debug \ A.dll' zugreifen, da sie von einem anderen Prozess verwendet wird.

Die einzige Möglichkeit, um diesen Fehler loszuwerden, ist Visual Studio neu zu starten. Gibt es eine andere Möglichkeit, das Entladen der A.dll-Baugruppe von VS zu erzwingen?

Antwort

8

Im VS2010 SP1 und wurde noch während des Build nach dem ersten Build blockiert zu werden beim Ausführen einer benutzerdefinierten T4-Vorlage während der POST-BUILD-Ereignisse, die auf Instanzen von Klassen desselben Projekts zugegriffen haben.

Wie ich es funktionierte, war Reflection zu verwenden, um auf Klassen von der Project-DLL zuzugreifen.

Ich habe immer noch das Blockierungsproblem beim Laden der DLL direkt aus der Datei.

HINWEIS: Der Trick bestand darin, die DLL als Bytearray in den Speicher zu laden und dann die Assembly aus dem RAW-Bytearray zu laden. DONT Laden von der Datei mit Assembly.LoadFrom

Dieser Code stammt aus meiner T4-Vorlagendatei und greift auf eine statische Klasse "Information" zu und ruft eine statische Methode "Version" auf, um einen String-Wert zurückzugeben.

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

Große Antwort! Aber wenn ich die Assembly über ein Byte-Array aus irgendeinem Grund bekomme ich alle Attribute in den Objekten in der DLL verlieren .. jemand anderes lief hinein? – Nemmy

2

m0sa Dieses Problem wurde in Visual Studio 2010 SP1 behoben.

Wenn Sie nicht in der Lage sind, das zu verwenden, gibt es ein VolatileAssembly Richtlinie Add-on in dem T4 Toolbox Projekt auf Codebox (http://t4toolbox.codeplex.com/)

+0

Ich verwende Visual Studio 2010 SP1, aber ich sehe immer noch das gleiche Problem. Zur Problemumgehung [mein Problem] (http://stackoverflow.com/questions/5886938/cannot-reference-dependency-assemblies-in-t4-template-when-using-transformonbuild) Ich verwende einen absoluten Pfad in der Assembly 'Richtlinie.Irgendeine Idee, was könnte falsch sein? –

+0

Ich fürchte nicht - oder das Testen auf dem SP1 Fix zeigte keine Probleme. Wenn Sie ein Verbindungsproblem mit einem repassierbaren Fall aufwerfen können, können wir es uns ansehen. – GarethJ

+7

Ich habe das gleiche Problem in Visual Studio 2013. –

Verwandte Themen