Запущенное преобразование .Net Core T4 не смогло загрузить файл или сборку

#c# #.net #asp.net-mvc #t4

#c# #.net #asp.net-mvc #t4

Вопрос:

У меня есть .Net Core Asp.Net Приложение MVC и я пытаюсь создать файл T4, который использует отражение для перечисления всех методов контроллера. Однако при обращении к классу контроллера он выдает ошибку. Я попытался добавить пакет Mvc.Core NuGet, но последняя версия 2.2.5, и по какой-то причине ожидается версия v3.1.0.0.

 Error       Running transformation: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' or one of its dependencies. The system cannot find the file specified.
File name: 'Microsoft.AspNetCore.Mvc.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
   at Microsoft.VisualStudio.TextTemplating5EB735DC155C701BA88F9010B0EBAB3638F86E339180B5A3766CEE0DDDB7B870EC569C6473D06A892E38A012E5B34C56690737513ADB101F2235F88AEABE2E1D.GeneratedTextTransformation.TransformText()
   at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
   at CallSite.Target(Closure , CallSite , Object )
   at Microsoft.VisualStudio.TextTemplating.TransformationRunner.PerformTransformation()
  

Это мой файл tt:

 <#@ template debug="false" hostspecific="false" language="C#" #>
<#@ template language="C#v3.1" #>
<#@ assembly name="System.Core" #>
<#@ output extension=".cs" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
class Foo {
    <# Assembly asm = Assembly.GetAssembly(typeof(UserController)); #>
}
  

Комментарии:

1. Я так и не нашел наилучшего способа сделать это, но в итоге нашел NSwag как хорошее решение для создания списка всех методов в моем контроллере.

Ответ №1:

Вы не можете напрямую ссылаться на классы сборки в шаблоне T4. если вы хотите получить доступ к пути с помощью сборки решения, вы можете использовать класс Host File.ReadAllText(this.Host.ResolvePath("Him.txt"));

Ответ №2:

 <#@ assembly name="$(SolutionDir)YourProjectbinDebugProject.Name.dll" #>
  

Вы можете получить доступ к классам, определенным в импортированной сборке, сложность заключается в том, чтобы предоставить внутренние классы вашему шаблону T4.