0

我有几个对外部 DLL 的引用的 .net c# 项目,有些是我自己的核心程序集,有些是第 3 方(例如 NewtownSoft.Json)。当我编译我的核心程序集时,已编译的 DLL 被移动到本地目录(从 /debug/bin 开始),例如 /development/common/binaries。然后我的 C# 项目在此处引用我的核心程序集,核心程序集将被复制到项目的输出目录中。

这就是问题所在,引用并复制了以前版本的 DLL,从我不知道的地方复制到输出目录。不仅如此,项目中的 DLL 类资源管理器也没有反映新的程序集。我什至尝试增加核心 dll 的版本并在项目中引用的程序集上强制执行特定版本。

有任何想法吗?我在这里和谷歌研究过这个话题,但真的没有找到解决方案。如果已涵盖此主题,请告知。我正在编译 3.5 .NET。

4

4 回答 4

1

NuGet用于第 3 方依赖项。每个项目都指定它具有哪些依赖项,以及它使用的这些依赖项的哪些版本。在构建时,NuGet 会为您获取所需的版本。

下载 NuGet(如果您的 VisualStudio 版本还没有),安装它,打开Package Manager Console窗口,然后运行类似Install-Package Newtonsoft.Json. 全部完成 :)


作为替代方案,您可以使用granadaCoders方法,这在专用依赖管理工具(如 NuGet 或 maven)之前是典型的。

一种常见的方法是设置解决方案的目录结构,例如:

 .\bin   <-- if you're doing continuous integration then your most recently built
             versions are placed in the bin folder
 .\docs  <-- docs is a home for any documentation related to the project
 .\lib   <-- lib is the root of all your third-party dependencies
 .\lib\{packagename}\ <-- each package gets it's own folder, such as 
                          Newtonsoft.Json.  All projects reference the package 
                          from here with a relative path.  If you update the 
                          third party assembly then all dependent projects get 
                          the update.
 .\src   <-- src is the root of all your releasable source code
 .\src\MySolution.sln <-- your Solution
 .\src\AProject\ <-- each project gets its own folder in src for all its contents
 .\test   <-- test is the root for all your test projects (unit/integration/etc)
 .\test\AProjectTests\  <-- each test project gets its own folder
于 2013-08-28T19:26:06.967 回答
0

I stay away from this world by:

Changing the folder structure to this:

.\MySolution.sln
.\MyFirstProject\MyFirstProject.csproj
.\MySecondProject\MySecondProject.csproj
.\MyThirdProject\MyThirdProject.csproj
.\MyOtherProject\SomeFolder\MyOtherProject.csproj
.\ThirdPartyReferences\

Put all of your referenced assemblies in ".\ThirdPartyReferences\". Have all the csproj reference the .dll's using the "..\ThirdPartyReferences\MyCoolDll.dll" (however many ".." you need)

The every csproj has to use the same version and originating location of any third party references.

于 2013-08-28T19:17:22.093 回答
0

我曾经遇到过类似的问题并以这种方式解决了(我认为是在 VS2010 中)。

  • 删除了参考
  • 添加了新版本的dll
  • 将“复制本地”设置为 false
  • 清洁解决方案
  • 建造
  • 对于需要它的 dll,将“复制本地”设置回 true

这似乎有点看似简单,但从那以后这个过程并没有让我失望。

于 2013-08-28T20:28:21.427 回答
0

如果您的项目是一个WEB SITE项目,而不是WEB APPLICATION一个完全不同的项目......那么这种行为是预期的。

本质上,在处理Web Site项目时,如果 Visual Studio 找到一个版本是GAC'd 或沿着任何搜索路径,它将重做您的程序集引用。这绝对是令人发狂的行为,我不知道他们为什么认为这是一件好事。但我离题了。

为了阻止 Visual Studio 执行此操作,您有两个选择。将解决方案转换为 Web 应用程序项目(无论如何您都应该使用),然后修复引用或将它引用的程序集拉出GAC.

说实话,我建议继续做这两种解决方案。 GAC'ing 程序集只是一个坏主意,通常会导致相当多的不良行为。当然,我知道有些公司(Infragistics 就是其中之一)建议在 GAC 中安装他们的垃圾。当您有多个依赖于不同版本(尤其是网站)的应用程序并且一个得到更新时,就会出现问题......

于 2013-08-28T19:43:48.257 回答