0

我正在针对目标框架.NET Framework 3.5进行开发。一个项目Logger使用下列库Visual Studio使用来自较新目标框架的程序集

Newtonsoft.Json.dll 
Version = 4.5.0.0 
AssemblyFileVersion = 5.0.8.16617 
PublicKeyToken = 30ad4fe6b2a6aeed 
TargetFramework = v3.5 

这是在项目中引用的程序集。

应用程序MyAppLogger项目具有项目引用,因此间接引用Newtonsoft.Json.dll

Copy Local属性设置为true将强制Newtonsoft.Json.dll被复制到输出目录。编译MyApp也会将Newtonsoft.Json.dll复制到相应的输出目录中。请注意,GAC中没有Newtonsoft.Json.dll

到目前为止还不错。

现在我安装了下列库为.NET Framework 4.0 GAC(%windir%\Microsoft.NET\assembly):

Newtonsoft.Json.dll 
Version = 4.5.0.0 
AssemblyFileVersion = 4.5.8.15203 
PublicKeyToken = 30ad4fe6b2a6aeed 
TargetFramework = v4.0 

了该库安装在GAC为.NET Framework 4.0会造成引用Newtonsoft.Json.dll项目不再复制到的MyApp输出目录。但它仍被复制到Logger的输出目录。

我试图解释这种行为对自己说:该项目引用Newtonsoft.Json.dll被复制到的Logger输出目录,因为它是Copy Local属性设置为true

但我不明白为什么Newtonsoft.Json.dll不再被复制到输出目录MyApp。我安装到GAC的库(.NET Framework 4.0)应该(在我看来)不会对构建系统“可见”,因为我的项目是针对.NET Framework 3.5构建的。

在运行时会有一个System.IO.FileNotFoundException因为Newtonsoft.Json.dll库中没有找到(这个我很清楚,因为库位于4.0 GAC是不是MyApp使用的GAC 3.5)。

  • 为什么目标框架3.5项目的构建系统知道GAR中的程序集是.NET Framework 4.0
  • 如何在目标框架中获得本地引用的Newtonsoft.Json.dll 3.5在GAC 4.0中有Newtonsoft.Json.dll时,将其复制到输出目录MyApp
+0

为什么您首先在GAC中安装库? – galenus

+0

这只是不工作,你真的*做*必须针对.NET 4.5才能够使用该版本的Newtonsoft.Json.dll。针对.NET 3.5是出错的地方。该程序集的早期版本也可以使用,但是仍然无法使用想要使用4.5版本的Logger程序集。定位3.5需要您使用的* all *程序集可以在v2 CLR上运行。与GAC混淆并不是一种解决方法。 –

+0

@HansPassant他引用的程序集的第一个版本似乎指向3.5(最后一行!)。如果我没有弄错,那么应该可以正常工作,只要他设法使他的申请参考正确的版本即可。 – Kjartan

回答

0

您是否尝试过在参数的属性下将Specific version设置为true?我怀疑编译期间会首先搜索GAC,因此如果您未指定版本,则任何版本都将被视为“可接受”,并且不会导出其他版本。

如果您指定了一个版本,那么来自GAC的版本不应被视为有效,而另一个版本应如前所述导出。

更新:我做了一个快速搜索,发现the Newtonsoft package seems to be released under an MIT liscence,这实际上意味着你可以做任何你想做的事情。

您可能需要自己编译一个解决方案,无论您需要什么目标框架和版本号。

+0

这两个库都有'版本4.5.0.0'。这是反射器发现的版本信息,此版本信息也由Visual Studio提供。不同的是'AssemblyFileVersion',但visual studio似乎忽略了这一点。 – faronel

+0

@faronel啊,好的。我没有注意到你的OP。但我发现它有点奇怪,有不同版本的'Newtonsoft.Json.dll'版本号相同(当它们针对不同版本的.Net框架时,它们怎么不会不同?)。我认为'Newtonsoft' dll不是你自己编译的东西? (如果是这样,你可以简单地创建它自己的不同版本,来解决这个问题) – Kjartan

+1

'Newtonsoft.Json.dll'库不是我自己编译的。具有目标框架3.5的版本从http://json.codeplex.com/下载,位于'/ Bin/Net35/Newtonsoft.Json.dll'下的zip文件中。 我自己用另一个版本号编译这个库是另一种选择。但是我想知道为什么这样做不起作用,因为我的目标框架是3.5,而GAC库是4.0。 – faronel

相关问题