2008-09-25 154 views
12

我有一个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是存在的;只有一个项目的输出缺失。

(编辑)我已验证参考设置为在参考属性窗口中复制本地。引用项目的DLL放在Windows服务项目的bin \ Release文件夹中,但未包含在为部署项目构建的MSI文件中。 (编辑2)在Joseph Daigle的建议之后,我检查了依赖关系在主输出的依赖关系列表中,并且它没有标记为“排除”,所以看起来并不是这个问题的原因。

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

+0

这仍然是VS2010中的一个问题,对我来说 – Grhm 2012-03-05 09:57:24

回答

5

我有一对夫妇更多的事情重现同一个怀疑MSI缺陷后添加。

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

2)使用“手动添加检测组件”解决方案后,我的团队实际遇到第二个问题。最初,我们在'\ Program Files \ xxx'的位置添加了依赖项,但是在64位机器上遇到了构建问题,即相同的依赖项位于'\ Program Files(x86)\ xxx'文件夹中,尽管VS足够智能在提取参考时处理这个问题。

  • 手动添加程序集的正确方法是导航到bin文件夹并添加本地复制的程序集。这确保了正确的程序集将存在于x86或x64机器上。
0

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

这会将缺少的文件复制到输出目录。

0

除了hectorsq的回应之外,请验证依赖项是否位于部署项目依赖项列表中,并且该问题的DLL标记为包含。

+0

你能澄清你的意思吗?“标记为包含”?我已验证依赖项位于主输出的依赖项列表中,并且未标记为“已排除”。 – 2008-09-25 17:52:23

+0

对不起,这就是我的意思,它没有标记为“排除”。不幸的是,它似乎应该包括在内,所以我很难过。 – 2008-09-25 18:49:24

0

你有没有试过在反射镜看你的DLL,看看它是否真的取决于其他的DLL?如果VS能够看到你没有真正使用它,VS足够聪明,不会包含引用程序集。

加入,即使你“认为”您正在使用它,可以VS优化掉你的使用 - 这是一种极限情况,但我已经看到了:

举例来说,如果你有一个'常量'汇编与此:

public const string LockPanelUrn = "ApplicationRack.LockPanel"; 

VS将坚持字符串直接在您的引用代码。

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

0

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

3

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

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

0

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

使用SMO对象的组件X.dll通过我保留在共享驱动器上的本地“Externals”文件夹引用Microsoft SMO对象。所有的模块都是参照这些编译的,但是我的安装项目和我的EXE项目一起检测到了我的SQL Server安装中的那些项目。

由于这个原因,我们有另一台机器具有带SMO对象的“Externals”文件夹,但是安装项目不再从'Detected Dependancies'中找到SMO对象,因为它没有意识到SMO对象在外部模块!我不知道它在哪里搜索Detected Dependancy文件,但它没有查看X.dll最初从哪里找到它们,或者甚至是EXE文件夹......