Ответ 1
Я бы разместил это в комментарии, если бы мог.
для вопроса: невозможно включить сборки, указанные в проекте, автоматически, но вы можете ограничить работу, которую вы должны выполнить.
если вы видите ссылку ниже в предложении номер 1, вы можете использовать С# для определения кода сборки, прежде чем он будет прочитан t4. которые позволяют читать директорию с отражением и загружать каждую сборку там. Вопрос в том, где будет ваша сборка?
List<Assembly> allAssemblies = new List<Assembly>();
string path = Assembly.GetExecutingAssembly().Location;
foreach (string dll in Directory.GetFiles(path, "*.dll"))
allAssemblies.Add(Assembly.LoadFile(dll));
<#@ assembly name=dll #>
это непроверено, но вы должны начать с этого. для справки → как загрузить все сборки из вашего каталога /bin
для второй части:
- используя
$(SolutionDir)
, но это то же самое, что и $(Project), за исключением одного уровня ниже. → Как использовать пользовательскую библиотеку/проект в текстовом шаблоне T4? - используйте утилиты С# path для перехода к нужному пути во время выполнения, но это может потребоваться сначала для сборки.
- Регистрация внешней библиотеки в GAC. эти швы, чтобы решить вашу проблему больше всего, так как вам не придется устанавливать путь вообще. see → Как зарегистрировать DLL.Net в GAC?
Изменить: здесь включена рабочая динамика. просто ссылайтесь на результат .ttinclude, сгенерированный этим в любом другом файле .tt
Я тестировал его с помощью отладчика и, похоже, работал.
и измените локализацию сборки, чтобы указать, где она вам нужна.
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Net.Http" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".ttinclude" #><#
List<Assembly> allAssemblies = new List<Assembly>();
string file = Assembly.GetExecutingAssembly().Location;
if(file!= "")
{
string path = Path.GetDirectoryName(file).TrimEnd();
if(path != "")
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
if(dll != "")
{
allAssemblies.Add(Assembly.LoadFile(dll));
#>\<#<#= "@ assembly name=\""+ dll +"\" "#>\#><#="\n"#><#
}
}
}
#>
вывод:
<#@ assembly name="C:\TEMP\3mo0m0mq.dll" #>
<#@ assembly name="C:\TEMP\4ybsqre3.dll" #>
<#@ assembly name="C:\TEMP\ao0bzedf.dll" #>
<#@ assembly name="C:\TEMP\bo2w102t.dll" #>
<#@ assembly name="C:\TEMP\c5o2syvv.dll" #>
<#@ assembly name="C:\TEMP\dz1fin10.dll" #>
<#@ assembly name="C:\TEMP\giym0gef.dll" #>
<#@ assembly name="C:\TEMP\hjfgqkov.dll" #>
<#@ assembly name="C:\TEMP\ibuz4wvb.dll" #>
<#@ assembly name="C:\TEMP\ilrcwa2y.dll" #>
<#@ assembly name="C:\TEMP\k0yeumhb.dll" #>
<#@ assembly name="C:\TEMP\kirzdsqp.dll" #>
<#@ assembly name="C:\TEMP\ksxl4f2z.dll" #>
<#@ assembly name="C:\TEMP\l4kja4ts.dll" #>
<#@ assembly name="C:\TEMP\ljgxkpo0.dll" #>
<#@ assembly name="C:\TEMP\lkvkmlct.dll" #>
<#@ assembly name="C:\TEMP\lnofhhlq.dll" #>
<#@ assembly name="C:\TEMP\nbqhmjqd.dll" #>
<#@ assembly name="C:\TEMP\oc3pxhmq.dll" #>
<#@ assembly name="C:\TEMP\qb43ntcu.dll" #>
<#@ assembly name="C:\TEMP\qlyoyhyr.dll" #>
<#@ assembly name="C:\TEMP\snwvtb00.dll" #>
<#@ assembly name="C:\TEMP\umhhb2wb.dll" #>
<#@ assembly name="C:\TEMP\xsyfel0b.dll" #>
<#@ assembly name="C:\TEMP\z1weyhko.dll" #>
вы можете избежать символа < # с \< # see this.