2015-06-24 23 views
3

我需要在T4模板中执行JSON模式生成,并且发现Newtonsoft的新Schema类远远超出手头上的目的(在控制台应用程序中测试过),但是,我无法似乎使它与其他球一起玩,因为Newtonsoft的实例总是返回null。T4与第三方程序集的模板

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文件,我在该项目的项目设置中设置文件夹的样子起坐,截图如下:

enter image description here

试图做下面的事情,失败,因为Newtonsoft无法找到:

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

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

回答

4

T4模板不使用项目中定义的参考路径T4不支持可视里面一些变量。演播室:

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

有一个existing StackOverflow question这个

如果你引用的.dll和它被复制到输出目录,你应该能够使用。 $(TargetDir),因此您不需要包含NuGet程序包版本号,在更新NuGet程序包时该版本号会发生变化。

+0

嗨马特,我遵循完全相同的讨论,它不适合我。它最终成为了Newtonsoft.Json.Schema的NuGet的版本,内部针对Newtonsoft.Json的v6 +进行了编译,并且我从NuGet获得了v7。奇怪的是,一个普通的控制台应用程序没有引发这个异常,只是当我想在T4中使用它时,它被引发,但不是通过传统的异常处理,必须真正挖掘才能找到这个错误。从GitHub获得了最新的.Schema,并使用版本7进行编译,并且工作正常。谢谢 – JadedEric

+0

我会把你发现的答案,因为其他人可能会遇到这种情况,也许没有找到你的解决方案的评论。 –

+0

好点,谢谢:) – JadedEric

1

发现这个解决方案并不像原来的错误那样具体。

我的Newtonsoft.Json版本是7.0.1版本,但是Newtonsoft.Json.Schema的编译版本是针对6.0.8版本的,它引起了内部“版本差异”错误,但从未被提升到顶部堆栈和T4刚刚通知元数据无法找到(理论上正确),但不是非常具体。

我从GitHub抓起一个Newtonsoft.Json.Schema的副本,并从NuGet编译成版本7,错误消失了。