【问题标题】:T4 Templating with 3rd party assembliesT4 使用第 3 方程序集进行模板化
【发布时间】:2015-06-26 17:34:01
【问题描述】:

我需要在 T4 模板中生成 JSON 模式,并且发现 Newtonsoft 的新 Schema 类足以满足手头的目的(在控制台应用程序中,经过测试),但是,我似乎无法让它发挥作用其余的,因为 Newtonsoft 的实例总是返回 null。

T4 声明:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="Newtonsoft.Json.dll" #>
<#@ assembly name="Newtonsoft.Json.Schema.dll" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>

程序集引用指向 DLL 文件,我在项目的项目设置中设置了文件夹查找,屏幕截图如下:

尝试执行以下操作失败,因为找不到 Newtonsoft:

var schema = Newtonsoft.Json.Schema.JSchema.Parse(jsoncontent);

引发的错误是:找不到元数据文件“Newtonsoft.Json.Schema.dll”

【问题讨论】:

    标签: json.net t4


    【解决方案1】:

    T4 模板不使用项目中定义的引用路径。 T4 确实支持 Visual Studio 中的一些变量:

    <#@ assembly name="$(SolutionDir)\MyProject\bin\Debug\SomeLibrary.Dll" #>
    

    关于这个有一个existing StackOverflow question

    如果您引用 .dll 并将其复制到输出目录中,您应该能够在路径中使用 $(TargetDir),因此您不需要包含 NuGet 包版本更新 NuGet 包时将更改的数字。

    【讨论】:

    • 嗨,马特,我遵循了完全相同的讨论,但它对我不起作用。它最终是来自 Newtonsoft.Json.Schema 的 NuGet 的版本,是针对 Newtonsoft.Json 的 v6+ 进行内部编译的,我从 NuGet 获得了 v7。奇怪的是,一个普通的控制台应用程序并没有引发这个异常,只是当我想在T4中使用这个时,它才被引发,而不是通过常规的异常处理,不得不真正挖掘才能找到这个错误。从 GitHub 获取最新的 .Schema,并使用版本 7 进行编译,并且可以正常工作。谢谢
    • 我会将您找到的内容作为答案,因为其他人可能会遇到此问题,并且可能无法在评论中找到您的解决方案。
    • @MattWard - 是 $(TargetDir)$(SolutionDir) T4 特定的还是基于其他东西(例如 msbuild 目标文件)?
    • 据我所知,它们是 Visual Studio 宏。
    【解决方案2】:

    发现此问题的解决方案不如原始错误所述的具体。

    我的 Newtonsoft.Json 版本是 7.0.1 版本,但编译后的 Newtonsoft.Json.Schema 版本与 6.0.8 版本相对,导致内部“版本差异”错误,但从未升到栈顶,而 T4 只是通知找不到元数据(理论上是正确的),但不是很具体。

    我从 GitHub 获取了一份 Newtonsoft.Json.Schema 的副本,并针对版本 7 从 NuGet 进行编译,错误消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多