ASP.Net汇编版地狱

时间:2013-08-28 19:08:09

标签: c# asp.net .net

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

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

有什么想法吗?我在这里和谷歌研究过这个话题,但实际上并没有找到解决方案。如果已涵盖此主题,请通知。我正在编译3.5 .NET。

谢谢, 卡尔..

4 个答案:

答案 0 :(得分:1)

NuGet用于第三方依赖项。每个项目都指定它具有哪些依赖项,以及它使用哪些依赖项版本。在构建时,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

答案 1 :(得分:0)

我远离这个世界:

将文件夹结构更改为:

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

将所有引用的程序集放在“。\ ThirdPartyReferences \”中。 让所有csproj使用“.. \ ThirdPartyReferences \ MyCoolDll.dll”引用.dll (无论多少“......”你需要)

每个csproj必须使用与任何第三方引用相同的版本和起始位置。

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

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

看起来似乎很简单,但这个过程并没有让我失望。