部署项目中缺少项目依赖项

时间:2008-09-25 17:20:31

标签: visual-studio-2008 deployment-project

我有一个VS2008部署项目,可以为几个Windows服务构建安装程序。

每个服务都引用了几个不同的项目:

CustomerName.MailSendingService
 -> CustomerName.Network
 -> CustomerName.Data
 -> CustomerName.Security

CustomerName.ProductIntegrationService
 -> CustomerName.Core
 -> CustomerName.Security

Windows服务项目,他们引用的项目以及部署项目都在同一个VS2008解决方案中。

我在部署项目的文件系统编辑器中添加了Windows服务项目的主要输出。

我的期望是Windows服务项目的主要输出将包括来自引用项目的DLL。但是,在构建部署项目时,缺少其中一个引用项目的DLL。 (CustomerName.ProductIntegrationService缺少CustomerName.Security

疯狂地,存在Windows服务引用的其他项目的DLL;只缺少一个项目的输出。

(编辑)我已经验证了引用在参考属性窗口中设置为Copy Local。引用项目的DLL放在Windows服务项目的bin\Release文件夹中,但未打包在为部署项目构建的MSI文件中。

(编辑2)按照Joseph Daigle的建议,我检查了依赖项是否在主要输出的依赖项列表中,并且没有标记为“已排除”,因此这似乎不是导致此问题的原因。 / p>

为什么只丢失一个项目的输出?

8 个答案:

答案 0 :(得分:5)

在复制相同的可疑msi缺陷后,我还需要补充几件事。

1)当我向安装程序添加共享相同检测到的依赖项的第二个项目输出时,它没有自动添加依赖项。我删除了两个项目输出并以相反的顺序添加它们。添加的第二个项目输出从未添加检测到的依赖项。这排除了项目的任何配置或代码问题以及如何添加引用。它总是第二个失败。

2)使用“手动添加检测到的程序集”解决方法后,我的团队确实遇到了第二个问题。最初我们从'\ Program Files \ xxx'中的位置添加了依赖项,但在64位计算机上遇到了构建问题,其中相同的依赖项位于'\ Program Files(x86)\ xxx'文件夹中,即使VS足够智能在获取参考文献时处理此问题。

  • 手动添加程序集的正确方法是导航到bin文件夹并添加本地复制的程序集。这可确保在x86或x64计算机上显示正确的程序集。

答案 1 :(得分:3)

我也可以证明这对我们来说也是一个问题。我怀疑它是部署项目中的一个错误 - 它只在一个位置添加依赖项目输出(也许它认为它是一个COM DLL?)

手动为缺失的dll添加主要输出似乎是一种可行的解决方法。

答案 2 :(得分:0)

我还没有使用过Visual Studio 2008,但是在2005年你必须验证项目中缺少的引用是否将Copy Local属性设置为true。

这会将丢失的文件复制到输出目录。

答案 3 :(得分:0)

除了 hectors

答案 4 :(得分:0)

你是否尝试在反射器中查看你的dll,看看它是否确实依赖于其他dll?如果可以看到你实际上没有使用它,那么VS非常聪明,不能包含引用的程序集。

除此之外,即使你'认为'你正在使用它,VS也可以优化你的使用 - 这是一个极限情况,但我已经看到了:

例如,如果您有一个'常量'程序集,请执行以下操作:

public const string LockPanelUrn = "ApplicationRack.LockPanel";

VS会将字符串直接粘贴在您的引用代码中。

除此之外,我建议删除并重建您的安装解决方案。

答案 5 :(得分:0)

在最初创建部署项目后,您是否添加了此程序集依赖项?如果是这样,您可能需要右键单击Detected Dependencies文件夹并选择Refresh Dependencies。它将拾取自上次执行此操作以来添加的任何新内容。

答案 6 :(得分:0)

检查一下 - 也许这并不能解释为什么会这样,但至少它提供了一些解决方法:)

http://lo-sharpdevs.blogspot.com/2009/07/vs-2008-disappearing-dependencies.html

答案 7 :(得分:0)

我遇到过与Microsoft SMO对象使用类似的问题。我有一个二进制组件(X.dll)使用我自己制作的这些Microsoft SMO对象。编译X.dll后,我使用X.dll(而不是代码)在另一个EXE项目中引用它。附加到的安装程序项目检测到它需要Microsoft SMO对象并检测到它们是我在计算机上安装SQL Server的本地文件。

使用SMO对象的组件X.dll通过本地“外部”文件夹引用Microsoft SMO对象,我保留在共享驱动器上。所有模块都参考这些模块进行编译,但是我的EXE项目的安装项目会检测我的SQL Server安装项目。

因此,我们有另一台具有SMO对象的“Externals”文件夹的机器,但是安装项目将不再从“Detected Dependancies”中找到SMO对象,因为它没有意识到SMO对象在外部模块!我不确定它在哪里搜索Detected Dependancy文件,但它不是在查看X.dll最初从哪里获取它们,甚至不是EXE文件夹...