我相信 DotNet 依赖解析有一个“首先检查 gac”规则。
所以我这样做我的参考。
\MySolution.sln
\BALLayer\Biz.csproj
\DALLayer\Data.csproj
\PresLayer\MyWebsite.csproj
\ThirdPartyReferences\
\ThirdPartyReferences\SuperCoolDll111.dll
\ThirdPartyReferences\SuperCoolDll222.dll
\ThirdPartyReferences\SuperCoolDll333.dll
这样,所有 csprojects 都使用相对路径引用所需的 dll。
所有 cs 项目都引用相同的 dll。
这帮助我避免了“无论你想让我做什么,我都会查看 GAC”的问题。
Nuget 的做法与此类似。
\packages\
\packages\repositories.config
\packages\SomeLibrary\SomeDll.dll
\packages\SomeLibrary\MyNugetDll.dll
和 cs 项目使用相对路径引用相同的 .dll。
............
脚注:
在记事本中打开 .csproj 文件,然后查找 HintPath。
我的总是说类似
<Reference Include="MyNugetDll.dll>
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\SomeLibrary\MyNugetDll.dll</HintPath>
</Reference>
或
<Reference Include="SuperCoolDll333.dll>
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdPartyReferences\SuperCoolDll333.dll</HintPath>
</Reference>
…………
但我认为您问题的症结在于“复制本地”和“gac first”规则。
…………
PS
这是另一个讨论顺序的问题......比我做得更好。
In what order are locations searched to load referenced DLLs?
编辑::::
所以吸取了教训:
如果您将第三方引用签入源代码管理,并且构建机器显示“我找不到 xyz.dll”,那么请确保该 dll 实际上在源代码管理中。安装了 Visual Studio 的(本地开发)机器上有很多“巫毒”路径,随后将不在“构建机器”上。
如果您使用 nuget 并签入您的 dll,请确保它们都已签入。您可能会在 packages.config 中添加一个新条目,然后忘记将实际的 dll 放入源代码管理中.
有一些使用 nuget 的方法,您只需将 packages.config 放在源代码管理中,而不是第三方 dll。查看这篇文章的 cmets 以获取有关此的文章。