C# 为什么在T4模板中反射自己的类型不起作用?

C# 为什么在T4模板中反射自己的类型不起作用?,c#,reflection,.net-core,t4,asp.net-core-2.1,C#,Reflection,.net Core,T4,Asp.net Core 2.1,我有一个.NET Core 2.1 ASP.NET MVC应用程序,其中有一个设计时T4模板,我想用它生成一些代码。目前看起来是这样的: <#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ assembly name="$(SolutionDir)\Bar\bin\Debug\netcoreapp2.1\Bar.

我有一个.NET Core 2.1 ASP.NET MVC应用程序,其中有一个设计时T4模板,我想用它生成一些代码。目前看起来是这样的:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(SolutionDir)\Bar\bin\Debug\netcoreapp2.1\Bar.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="Bar" #>
<#@ output extension=".txt" #>
<#
    var myType = typeof(string);
    var myName = y.Name;
    Write(myName);    
#>
现在我想使用Foo而不是string,所以我只需更改行

var myType = typeof(string);

并保存模板。现在我得到一个错误:

正在运行转换:System.IO.FileNotFoundException:无法 加载文件或程序集'System.Runtime,版本=4.2.1.0, 区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'或其 依赖关系

堆栈跟踪如下所示:

File name: 'System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
    at Microsoft.VisualStudio.TextTemplating9418B77BB4C607966DB4F31F6C9D57D97D9892B08324572567CEAC228ECCD2BE3839F9E2A0AE0ECA2D5DD0CCC161A70762C40A6D67A8DC505F3E88E86A36C7CE.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()

为什么会抛出这个错误?为什么反射适用于内置字符串类型,但在某种程度上依赖于.NET Framework 4.2.1适用于我自己的.NET Core 2.1类型?

T4引擎使用.NetFramework,因此它在引用.NET Core dll时遇到与任何其他.NET Framework应用程序相同的问题。T4在单独的应用程序域中运行,不会继承.net核心项目的引用

typeof(string)之所以有效,是因为它是.Net框架的一部分。类型“Foo”取决于对.Net核心程序集的引用。我不确定是否可以在不将程序集移植到.Net标准的情况下将.Net核心程序集加载到T4中


您可以尝试,但我看到人们使用T4的通常方式是通过、Roslyn或Visual Studio SDK访问他们在项目中拥有的类的信息。除非有不同的原因要从T4反映到.Net核心程序集中,否则通过EnvDTE检索类型信息不会有问题

我用一种变通方法解决了这个问题

尝试将此bindingRedirect放入
C:\Users\\AppData\Local\Microsoft\VisualStudio\15.0\u 29f8d23a\devenv.exe.config中
->
所有其他bindingRedirect的位置在哪里



但是,我在发布的代码中使用了汇编指令,它仍然无法访问该程序集中的类型。啊,我现在看到了。对不起,误会了。HMMMM更新了我的答案,不过我想听听您是否最终成功引用了T4中的.net核心程序集
var myType = typeof(Foo);
File name: 'System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
    at Microsoft.VisualStudio.TextTemplating9418B77BB4C607966DB4F31F6C9D57D97D9892B08324572567CEAC228ECCD2BE3839F9E2A0AE0ECA2D5DD0CCC161A70762C40A6D67A8DC505F3E88E86A36C7CE.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()