Сборка сборочных блоков T4 - PullRequest
5 голосов
/ 12 января 2011

В Visual Studio 2010 у меня есть следующий макет проекта:

  • Решение
    • проект A
      • класс C
      • класс D
    • проект B
      • шаблон T4

Шаблон T4 содержит ссылку на сборку, подобную этой:

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

Шаблон создает экземпляр класса C. Когда я запускаю шаблон T4, процессор загружает dll проекта A и правильно создает выходные данные.Ошибка возникает, когда я хочу что-то изменить в проекте A, скажем, изменить класс C или D.

Невозможно скопировать файл "obj \ Debug \ A.dll" в "bin \ Debug \ A".dll».Процесс не может получить доступ к файлу «bin \ Debug \ A.dll», поскольку он используется другим процессом.

Единственный способ избавиться от этой ошибки - перезапустить Visual Studio.Есть ли другой способ принудительно выгрузить сборку A.dll из VS?

Ответы [ 2 ]

8 голосов
/ 20 сентября 2011

Я использую VS2010 SP1 и все еще блокировался во время сборки после первой сборки при запуске пользовательского шаблона T4 во время событий POST-BUILD, которые обращались к экземплярам классов того же проекта.

Как я получил егоработа заключалась в том, чтобы использовать Reflection для доступа к классам из dll проекта.

У меня все еще возникала проблема с блокировкой при загрузке dll прямо из файла.должен был загрузить .dll в память как байтовый массив, а затем загрузить сборку из необработанного байтового массива.НЕ загружайте из файла с помощью Assembly.LoadFrom

Этот код взят из моего файла шаблона T4 и обращается к статическому классу «Информация» и вызывает статический метод «Версия» для возврата строкового значения.

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);
2 голосов
/ 13 января 2011

m0sa Эта проблема была исправлена ​​в Visual Studio 2010 SP1.

Если вы не можете использовать это, в проекте T4 Toolbox для CodeBox есть надстройка директивы VolatileAssembly (http://t4toolbox.codeplex.com/)

...