引用.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文件里进行排除