C# 如何设置nuget引用的动态路径?

C# 如何设置nuget引用的动态路径?,c#,.net,visual-studio,nuget,nuget-package-restore,C#,.net,Visual Studio,Nuget,Nuget Package Restore,以下是示例项目结构: { ProjectA } { packages } <-- packages are created here { ProjectA } - ProjectA.csproj <-- references ProjectB and C. - packages.config - ProjectA.sln <-- contains all projects: A, B and C. { ProjectB

以下是示例项目结构:

{ ProjectA }
    { packages } <-- packages are created here
    { ProjectA }
        - ProjectA.csproj <-- references ProjectB and C.
        - packages.config
    - ProjectA.sln <-- contains all projects: A, B and C.

{ ProjectB }
    - ProjectB.csproj
    - packages.config

{ ProjectC }
    - ProjectC.csproj
    - packages.config   

*{ packages} <-- *When I manually paste packages here. So one level above ProjectB.csproj file, then ProjectB compiles.
{ProjectA}

{packages}最简单的修复方法是将
HintPath
设置为:

<HintPath>$(SolutionDir)\packages\...
$(SolutionDir)\packages\。。。
在ProjectB和ProjectC的
.csproj
文件中。它的字面意思是:“在包文件夹中查找与解决方案文件在同一级别生成的引用。解决方案文件,它正在尝试编译您”


此问题已报告多次。我相信它已经修好了。还有,但我没有测试它。

由于packages.config逐渐被弃用,您可以将您的项目从packages.config迁移到
ProjectReference
,其中在csproj文件中指定NuGet包,并使用共享全局位置存储包(没有任何带有
HintPath
的引用需要更改)

在VS 2017版本15.7中,将在引用节点的上下文菜单中提供一个迁移选项(已在预览中提供):

PackageReference
在VS2017中已经得到支持,因为大约在15.1或15.2版本中,只有迁移工具处于预览状态

对于新项目,VS 2017(当前版本!)您已经可以选择默认的包参考样式,并允许为新项目选择它:


Nuget 3.x有packages.config概念,在这个包中,在2处提到了名称和版本(在package.config和.csproj文件中)

包配置中的引用应如下所示:

<package id="NewtonsoftJson" version="9.0.1" targetFramework="net46" />
<HintPath>..\packages\NewtonsoftJson.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>

csproj中的提示路径应如下所示:

<package id="NewtonsoftJson" version="9.0.1" targetFramework="net46" />
<HintPath>..\packages\NewtonsoftJson.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
。\packages\NewtonsoftJson.9.0.1\lib\net45\Newtonsoft.Json.dll
此处“.\packages”表示向上一级(表示在解决方案级别)并查找“packages”文件夹

您应该验证提示路径是否存在。并且包版本在两个文件(Package.config和.csproj)中应相同(9.0.1)

当您的项目C编译成功时,似乎只有ProjectB使用的包中存在一些问题

如果您仍面临此问题,请提供以下详细信息以供进一步分析

  • “包配置”
  • “项目B.csproj”
  • msbuild编译日志,以了解您在哪个包中 我们面临着这个问题

  • 您是否在管理NuGet Package for Solution…中的项目B和C中检查了每个包依赖项?引用将自动设置。@Jasen我不确定是否理解。当我单击Project B的管理NuGet Package for Solution…时,我可以看到带有“绿色检查”的包在Installed(已安装)选项卡中。它们已安装并放入解决方案所在的package文件夹中。只是,当我查看Rereferences(重新引用)列表时,它们会以黄色警告列出。项目生成了它,但无法看到它们:/@Jasen当我将
    packages
    文件夹(手动)粘贴到
    ProjectB
    文件夹的同一级别时(看我编辑的问题),因此它与ProjectB的“潜在”解决方案文件处于同一级别(尽管那里没有ProjectB.sln文件)-它将在一个位置编译.So->ProjectB生成的包,然后在另一个位置查找引用:///如果您在解决方案上调用该工具,包管理器将显示一个网格,其中包含解决方案下的所有项目--每个项目都有一个复选框。有时在新安装后,您需要还原包。但是引用设置是自动的。如果您有问题,可能需要取消引用包并卸载它,然后重新安装包。不起作用。引用将,相同的包文件夹-将,nuget下载-否。您需要在同一级别上拥有所有项目。如果您想要不同级别,则每个级别都需要解决方案。解决方案具有
    .nuget\nuget.config
    。在那里,您可以设置
    。您可以为每个级别添加“..”。$(SolutionDir)仅为“从IDE生成”定义。@用户名实际上我只是从IDE生成应用程序,所以它看起来不错,而且很有效!我仍在探索我的选项though@Marshall这是一个有趣的解决方案,但您需要记住,每次添加nuget包时,都需要在.proj文件中进行手动操作evel和nuget.config已经设置了(或默认)@T.S是的,我知道。但是这个解决方案的好处是我没有“牺牲”任何东西。我认为默认路径
    。\packages\..
    实际上是
    $(SolutionDir)\packages\…
    。在我们切换到VS2017之前,我会接受这个答案。这并不理想(只是暂时的),但这正是我所期待的,我们仍然在VS2015上,
    $(SolutionDir)
    解决方案在这一点上对我们来说可能是最好的。KISS,对吗?当我切换到VS2017时,我会回到这个答案。谢谢Toughya$(SolutionDir)仅在构建解决方案时有效,因此如果希望
    msbuild my.csproj
    工作,您可能需要使用回退更新项目文件。(在VS2017中,使用
    目录.Build.props
    为所有项目设置默认值会更容易)谢谢@Martin,我非常感谢您的帮助。我将继续使用“解决方案”解决方案,因为我们没有很多这样的项目,所以我们已经修复了它们。现在,这很好。我们将在将来看到(虽然我知道这可能是临时解决方案)。np在所有,请在将来的问题中包括VS版本。您的答案不能解决同一解决方案中的项目文件夹级别问题。请提供“包配置”、“ProjectB.csproj”和编译日志