代码之家  ›  专栏  ›  技术社区  ›  Joseph Anderson

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

  •  12
  • Joseph Anderson  · 技术社区  · 16 年前

    我有一个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的建议,我检查了依赖项是否在主输出的依赖项列表中,并且没有标记为“排除”,因此这似乎不是导致此问题的原因。

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

    8 回复  |  直到 5 年前
        1
  •  5
  •   Chad Pavliska    14 年前

    在复制了相同的疑似msi缺陷之后,我还有更多的东西要添加。

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

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

    • 手动添加程序集的正确方法是导航到bin文件夹并添加本地复制的程序集。这样可以确保X86或X64计算机上存在正确的程序集。
        2
  •  3
  •   Sam    15 年前

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

    为丢失的dll手动添加主输出似乎是一个可行的解决方案。

        3
  •  0
  •   hectorsq    16 年前

    我还没有使用Visual Studio 2008,但是在2005年,您必须验证项目中缺少的引用是否已将“复制本地”属性设置为true。

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

        4
  •  0
  •   Joseph Daigle Sarabpreet Singh Anand    16 年前

    除了 赫托斯克 的响应,请验证Depedency是否在部署项目依赖项列表中,并且相关的dll是否标记为要包含。

        5
  •  0
  •   Benjol    16 年前

    您是否尝试在Reflector中查看您的dll,以查看它是否确实依赖于其他dll?如果可以看到您实际上没有使用引用的程序集,则VS足够智能,不会包含它。

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

    例如,如果您有一个“常量”程序集,其中包含:

    public const string LockPanelUrn = "ApplicationRack.LockPanel";
    

    vs将把字符串直接插入引用代码中。

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

        6
  •  0
  •       16 年前

    在最初创建部署项目之后是否添加了此程序集依赖项?如果是,您可能需要右键单击“检测到的依赖项”文件夹,然后选择“刷新依赖项”。它将接收自上次执行此操作以来添加的任何新内容。

        7
  •  0
  •   LiLol    15 年前

    看看这个-也许这不能解释为什么是这样,但至少它提供了一些解决方法:)

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

        8
  •  0
  •   Max Power    13 年前

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

    使用SMO对象的组件x.dll通过保存在共享驱动器上的本地“externals”文件夹引用Microsoft SMO对象。所有模块都是参照这些模块编译的,但是我的install project with my exe project会检测到来自我的SQL Server安装的模块。

    因此,我们有另一台机器,它具有带有SMO对象的“externals”文件夹,但是安装项目将不再从“detected dependencies”中找到SMO对象,因为它没有意识到SMO对象在externals模块中!我不确定它在哪里搜索检测到的依赖文件,但它不查看x.dll最初从何处获取这些文件,甚至可能是exe文件夹…

    推荐文章