我有一个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>
为什么只丢失一个项目的输出?
答案 0 :(得分:5)
在复制相同的可疑msi缺陷后,我还需要补充几件事。
1)当我向安装程序添加共享相同检测到的依赖项的第二个项目输出时,它没有自动添加依赖项。我删除了两个项目输出并以相反的顺序添加它们。添加的第二个项目输出从未添加检测到的依赖项。这排除了项目的任何配置或代码问题以及如何添加引用。它总是第二个失败。
2)使用“手动添加检测到的程序集”解决方法后,我的团队确实遇到了第二个问题。最初我们从'\ Program Files \ xxx'中的位置添加了依赖项,但在64位计算机上遇到了构建问题,其中相同的依赖项位于'\ Program Files(x86)\ xxx'文件夹中,即使VS足够智能在获取参考文献时处理此问题。
答案 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文件夹...