欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

引用.net Core类时T4模板无法加载文件或程序集“ System.Runtime,版本= 4.2.2.0”

程序员文章站 2022-04-14 16:13:20
用.net Core 编写的T4模板类, 在T4里引用运行时,会有 错误 正在运行转换: System.IO.FileNotFoundException: 未能加载文件或程序集“System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyTo ......

用.net core 编写的t4模板类, 在t4里引用运行时,会有

错误        正在运行转换: system.io.filenotfoundexception: 未能加载文件或程序集“system.runtime, version=4.2.2.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。
文件名:“system.runtime, version=4.2.2.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a”
   在 microsoft.visualstudio.texttemplatingdf348cb3fb09e8e166e437124f9f88342823ff1d21bc7b73048e47a611d6dc38ad43d38b26e23a35527758646c26c0d989c154cdcd9b21719cc1a062236a2570.generatedtexttransformation.transformtext()
   在 microsoft.visualstudio.texttemplating.transformationrunner.performtransformation()

警告: 程序集绑定日志记录被关闭。
要启用程序集绑定失败日志记录,请将注册表值 [hklm\software\microsoft\fusion!enablelog] (dword)设置为 1。
注意: 会有一些与程序集绑定失败日志记录关联的性能损失。
要关闭此功能,请移除注册表值 [hklm\software\microsoft\fusion!enablelog]。    ark.y2020.dbmodel    d:\mycode\其他项目\ark2020\ark.y2020.dbmodel\bcbenefitconsume.tt    1    

在使用t4的模板,代码类似

<#@ template debug="false" hostspecific="false" language="c#" #>
<#@ assembly name="system.core" #>
<#@ import namespace="system.linq" #>
<#@ import namespace="system.text" #>
<#@ import namespace="system.reflection" #>
<#@ import namespace="services.resources.datatransferobjects.infrastructures" #>
<#@ import namespace="system.collections.generic" #> 
<#@ assembly name="$(targetdir)services.dll" #>
<#@ output extension=".cs" #>
public class admindto
{
        <#var editableobjs = assembly
            .getassembly(typeof(genericeditable<>))
            .gettypes()
            .where(p => p.basetype != null && p.basetype.isgenerictype && p.basetype.getgenerictypedefinition() == (typeof(genericeditable<>)))
            .tolist();
        #>
}

即使项目引用system.runtime.dll也是没有用的, 这个问题的本质是vs2019工具在运行t4程序时的问题, 所以可以修改vs相关的配置才可以

方法一:

参考: 

c:\users\<user>\appdata\local\microsoft\visualstudio\15.0_29f8d23a\devenv.exe.config里有<configuration>-> <runtime>-> <assemblybinding>

<dependentassembly>
  <assemblyidentity name="system.runtime" publickeytoken="b03f5f7f11d50a3a" culture="neutral"/>
  <bindingredirect oldversion="0.0.0.0-5.0.0.0" newversion="4.0.0.0"/>
</dependentassembly>

 

方法二:

上面说了,问题本质是vs的问题, 所以我们不用.net core编写t4的辅助类即可,使用.net framework的项目,然后把相关的dll复制到解决方案目录下

t4的模板如下:

<#@ template debug="flase" hostspecific="true" language="c#" #>
<#@ assembly name="$(solutiondir)t4dll/tc.ab.t4.dll" #>
<#@ assembly name="$(solutiondir)t4dll/mysql.data.dll" #>
<#@ import namespace="tc.ab.t4" #>
<#@ import namespace="system.text.regularexpressions" #>
<#@ import namespace="system.diagnostics" #>
<#@ output extension=".cs" #>
<#
    //debugger.launch(); debugger.break();//调试用template debug="true" hostspecific="true" language="c#"
    dbfield dbrender = new dbfield(this.host.templatefile,"tcitravelorder");//数据库链接名称可以不传,默认metadatadb
    dbrender.namespacestr="tc.itravel.admin.dbmodel";  
    dbrender.onlytable.add("bcbenefitconsume");//只要生成的表,区分大小写
    this.writeline(dbrender.render()); 
#>

 这种情况只是vs使用了framework版本的类, 项目本身还是core, 所以不影响项目的发布,如果是docker发布,可以在.dockerignore文件里进行排除