Я пишу текстовый шаблон T4, который читает CSV, содержащий имена классов с их полным пространством имен (MyNamespace.ClassExample), которые находятся в сборке, отличной от той, где находится T4.
Мне нужно разрешитькорреспондент System.Type
в коде генератора T4.
Я уже пытался разрешить тип из System
, и он работает так, как ожидалось, но когда я пытаюсь разрешить тип из моей сборки, он возвращаетзначение NULL. Даже используя полное имя сборки.
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="$(TargetDir)ClassLibrary1.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="ClassLibrary1" #>
<#
Type type = Type.GetType("System.String");
Type type2 = Type.GetType("ClassLibrary1.Class1");
Type type3 = Type.GetType("ClassLibrary1.Class1, ClassLibrary1");
#>
This is a <#=type#>
This is a <#=type2#>
This is a <#=type3#>
Создает следующий вывод:
This is a System.String
This is a null
This is a null
Как вы можете видеть, я пытался загрузить dll сборки, включая ClassLibrary1
Пространство имен на всякий случай (даже если оно не нужно).
Также пытался использовать EnvDTE, этот ответ на похожий вопрос выглядел многообещающе https://stackoverflow.com/a/38225980/2347708, но не может решить ITypeResolutionService
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="EnvDte" #>
<#@ assembly name="$(TargetDir)ClassLibrary1.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="ClassLibrary1" #>
<#
Type GetTypeByName(IServiceProvider provider, string typeName)
{
var svc = (ITypeResolutionService)provider.GetService(typeof(ITypeResolutionService));
// svc is null.
return svc.GetType(typeName);
}
Type type = Type.GetType("System.String");
Type type2 = GetTypeByName((IServiceProvider)this.Host, "ClassLibrary1.Class1, ClassLibrary1");
#>
This is a <#=type#>
This is a <#=type2#>