我有一个C#项目(ProjectA),它在一个单独的过程中调用另一个C#项目(ProjectB)。构建输出目录结构为:
/ProjectA.exe
/ProjectB/ProjectB.exe
ProjectA和ProjectB引用同一程序集的不同版本,在本例中为Newtonsoft.Json.dll。
通过将ProjectB的nuget包添加到ProjectA,可以实现生成输出目录的结构。ProjectA和ProjectB在单独的解决方案中,并且分别构建。ProjectB的nuget包是使用以下.nuspec和.targets创建的。
<?xml version="1.0"?>
<package>
<metadata>
<id>ProjectB</id>
<version>$version$</version>
<title>ProjectB</title>
<authors>me</authors>
<owners>me</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>ProjectB</description>
<copyright>Copyright 2016</copyright>
<tags>ProjectB</tags>
</metadata>
<files>
<file src="x64\Release\*" target="build" />
<file src="ProjectB.targets" target="build/ProjectB.targets" />
</files>
</package>
。
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)*" />
<Content Include="@(NativeLibs)">
<Link>ProjectB\%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
我的问题是ProjectA从ProjectB nuget包/ build目录中引用了较新的Newtonsoft.Json.dll,而不是ProjectA解决方案中较旧的Newtonsoft.Json.dll。它们是不同的版本,因此在运行时会引起问题。我意识到我可以在ProjectA解决方案中更新Newtonsoft.Json.dll的版本,但是我希望能够解决更通用的情况。如何防止Visual Studio找到错误的Newtonsoft.Json.dll?
最后,将链接的项目组与所有ProjectB程序集一起添加始终会导致将错误的程序集版本拖入ProjectA的问题。我不得不求助于robocopy postbuild命令来完成我想要的事情。缺点是当另一个项目引用ProjectA时,不会复制ProjectB程序集,但这对我而言并不重要。如果Microsoft使用魔术程序集路径解决了此问题,则原始问题中的nuget程序包应该可以正常工作。以下是使用robocopy解决方法的.nuspec和.targets文件。
<?xml version="1.0"?>
<package>
<metadata>
<id>ProjectB</id>
<version>$version$</version>
<title>ProjectB</title>
<authors>me</authors>
<owners>me</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>ProjectB</description>
<copyright>Copyright 2016</copyright>
<tags>ProjectB</tags>
</metadata>
<files>
<file src="x64\Release\*" target="build/ProjectB" />
<file src="ProjectB.targets" target="build/ProjectB.targets" />
</files>
</package>
。
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="ProjectBCopyTarget" AfterTargets="Build">
<Exec Command="robocopy /PURGE $(MSBuildThisFileDirectory)ProjectB $(TargetDir)ProjectB || if %ERRORLEVEL% LSS 8 exit 0"/>
</Target>
</Project>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句