当前位置: 移动技术网 > IT编程>开发语言>.net > 引用.net Core类时T4模板无法加载文件或程序集“ System.Runtime,版本= 4.2.2.0”

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

2020年03月27日  | 移动技术网IT编程  | 我要评论

catia模具设计教程,sewang,普法栏目剧单行道5

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网