安装后的程序集依赖关系更改

时间:2015-06-19 17:45:09

标签: .net visual-studio dependencies installer .net-assembly

我有一个.NET应用程序似乎有一些依赖版本在调试和作为已安装的发布应用程序运行之间发生变化。我只关注Castle.Core汇编以获取我的详细信息,但同样的问题也会出现在其他几个问题上。我使用的NuGet包需要Castle.Core作为依赖项(我的问题的所有情况都与源自NuGet的程序集有关,以防它重要)。

在Visual Studio中,当我安装具有Castle.Core依赖关系的NuGet包时,一切都运行得很好,包括Debug和Release配置。我可以看到Castle.Core项目引用是引用版本3.3.0.0。但是,当我使用InstallShield打包Release配置生成的所有内容并安装应用程序(所有程序集都位于同一程序目录中)时,我收到此运行时错误:

  

无法加载文件或程序集' Castle.Core,Version = 3.2.0.0,   Culture = neutral,PublicKeyToken = 407dd0808d44fbdc'或其中一个   依赖。定位程序集的清单定义没有   匹配程序集引用。 (HRESULT异常:0x80131040)

NuGet包将其对Castle.Core的依赖性列为(≥3.2.0.0&&< 4.0.0.0)。 3.2.0.0和3.3.0.0都满足这些条件。

如果我手动将Castle.Core降级到3.2.0.0,我的项目参考显示它确实已降级。但是当我在Visual Studio中运行该项目时,我得到了:

  

无法加载文件或程序集' Castle.Core,Version = 3.3.0.0,   Culture = neutral,PublicKeyToken = 407dd0808d44fbdc'或其中一个   依赖。定位程序集的清单定义没有   匹配程序集引用。 (HRESULT异常:0x80131040)

内部例外:

  

无法加载文件或程序集' Castle.Core,Version = 3.2.0.0,   Culture = neutral,PublicKeyToken = 407dd0808d44fbdc'或其中一个   依赖。定位程序集的清单定义没有   匹配程序集引用。 (HRESULT异常:0x80131040)

但是,如果我将其打包到安装程序中并将其作为已安装的应用程序启动,则可以正常运行。

对我来说,感觉就像将程序集打包到安装程序中会导致依赖版本发生变化。我无法想象会出现这种情况,但我无法提出更好的解释。

任何人都可以解释这里发生了什么,以及我如何解决它?

2 个答案:

答案 0 :(得分:13)

好的,想通了。首先, facepalm

通过NuGet添加的程序集对Castle.Core 3.2.0具有特定的版本依赖性。但是,由于该程序集仍然可以与Castle.Core 3.2.0-4.0.0一起使用,因此程序集绑定重定向已添加到App.config中,该程序向装配程序加载程序指示需要该范围内的版本的任何程序集应尝试加载Castle .Core 3.3.0,这是在我的app安装程序中打包的版本。我没有意识到我没有在我的安装程序中包含配置文件,所以配置由Visual Studio加载而没有问题,而安装的应用程序在app dir中缺少该文件。

答案 1 :(得分:3)

我有同样的问题,我只是降级到最少的Moq版本可用而且它有效。