引用的DLL未被复制到引用项目

时间:2013-10-02 08:43:27

标签: .net visual-studio-2010 reference fluent-nhibernate .net-assembly

这个问题可能已被多次询问过,也许我只是擅长使用搜索功能以及谷歌,但我还没有找到这个问题的答案。

我目前有两个项目,项目X,项目Y和项目Z(仅包含映射)

Project X是一个FluentNhibernate项目,它保存了我的sessionfactories和类似的东西。所以这也是映射加载和事物的地方(这很重要,我怀疑它可能是我遇到的问题的全部原因)

现在,在Project X中,我引用了一个使用Microsoft.SqlServer.Types.dll。

的程序集

项目Y是一个使用项目X进行数据库连接的服务。

所有的probjects都可以在我的开发机器上完美地查找和运行,但是当部署到我们的服务器时,它们无法正常运行(运行时错误)。错误是非常模糊的,因为它指向缺少FluentNHibernate程序集,但事实并非如此。

Procmon.exe幸运地显示代码试图加载Microsoft.SqlServer.Types.dll,因为服务器没有安装SQL Server(我的客户端也没有,但它有一个管理工作室,很可能安装它。 DLL以及。)

到目前为止一直很好,复制了DLL并且它工作了(是的!)。

现在我想我将程序集添加到项目X以确保使用项目X将此引用复制到其他项目。这没有发生....所以我尝试设置'复制本地'设置为真。

遗憾的是,这仍然没有将.dll复制到引用项目Y。

有没有办法让这种情况发生,或者这个Visual Studio是否聪明并且意识到Project Y不需要这个.dll而拒绝复制它?

(由于Project Z需要实际引用而Project X加载此程序集@ run time,因此Z和X之间没有“硬”引用)​​

任何Stackoverflow天才都可以对此有所了解,因为老实说,我想知道为什么它会以这种方式运行(理想情况下是一种使其表现得像我想要的那样)。

3 个答案:

答案 0 :(得分:7)

这个问题已经得到了解答,但我想我将包含一个通用的故障安全方法,用于将所有间接引用复制到项目的输出目录中。

  1. 为要包含在输出中的所有参考设置将本地复制设置为 true
  2. 将副本间接依赖关系代码(见下文)保存到名为CopyIndirectDependencies.targets的文件中,并将目标文件放在项目目录中。
  3. 修改您的.csproj.vbproj以包含对您添加的.targets文件的导入。见下面的例子。
  4. 构建项目,您应该将辅助依赖项自动复制到构建输出。

  5. CopyIndi​​rectDependencies.targets 文件内容

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <CopyIndirectDependencies   
          Condition="'$(CopyIndirectDependencies)'==''">true</CopyIndirectDependencies>
        <CopyIndirectDependenciesPdb
          Condition="'$(CopyIndirectDependenciesPdb)'==''">false</CopyIndirectDependenciesPdb>
        <CopyIndirectDependenciesXml
          Condition="'$(CopyIndirectDependenciesXml)'==''">false</CopyIndirectDependenciesXml>
      </PropertyGroup>
    
    
      <!-- BuildXxx part -->
    
      <Target Name="CopyIndirectDependencies"
              Condition="'$(CopyIndirectDependencies)'=='true'"
              DependsOnTargets="DetectIndirectDependencies">
        <Copy Condition="'%(IndirectDependency.FullPath)'!=''"
              SourceFiles="%(IndirectDependency.FullPath)"
              DestinationFolder="$(OutputPath)"
              SkipUnchangedFiles="true" >
          <Output TaskParameter="CopiedFiles"
                  ItemName="IndirectDependencyCopied" />
        </Copy>
        <Message Importance="low"
                 Condition="'%(IndirectDependencyCopied.FullPath)'!=''
                   and '%(IndirectDependencyCopied.Extension)'!='.pdb'
                   and '%(IndirectDependencyCopied.Extension)'!='.xml'"
                 Text="Indirect dependency copied: %(IndirectDependencyCopied.FullPath)" />
      </Target>
    
      <Target Name="DetectIndirectDependencies"
              DependsOnTargets="ResolveAssemblyReferences">
    
        <Message Importance="low"
                 Text="Direct dependency: %(ReferencePath.Filename)%(ReferencePath.Extension)" />
        <Message Importance="low"
                 Text="Indirect dependency: %(ReferenceDependencyPaths.Filename)%(ReferenceDependencyPaths.Extension)" />
    
        <!-- Creating indirect dependency list -->
        <CreateItem Include="%(ReferenceDependencyPaths.FullPath)"
                    Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true'">
          <Output TaskParameter="Include"
                  ItemName="_IndirectDependency"/>
        </CreateItem>
        <CreateItem Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).xml"
                    Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true' and '$(CopyIndirectDependenciesXml)'=='true'">
          <Output TaskParameter="Include"
                  ItemName="_IndirectDependency"/>
        </CreateItem>
        <CreateItem Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).pdb"
                    Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true' and '$(CopyIndirectDependenciesPdb)'=='true'">
          <Output TaskParameter="Include"
                  ItemName="_IndirectDependency"/>
        </CreateItem>
    
        <!-- Filtering indirect dependency list by existence -->
        <CreateItem Include="%(_IndirectDependency.FullPath)"
                    Condition="Exists('%(_IndirectDependency.FullPath)')">
          <Output TaskParameter="Include"
                  ItemName="IndirectDependency"/>
        </CreateItem>
    
        <!-- Creating copied indirect dependency list -->
        <CreateItem Include="@(_IndirectDependency->'$(OutputPath)%(Filename)%(Extension)')">
          <Output TaskParameter="Include"
                  ItemName="_ExistingIndirectDependency"/>
        </CreateItem>
    
        <!-- Filtering copied indirect dependency list by existence -->
        <CreateItem Include="%(_ExistingIndirectDependency.FullPath)"
                    Condition="Exists('%(_ExistingIndirectDependency.FullPath)')">
          <Output TaskParameter="Include"
                  ItemName="ExistingIndirectDependency"/>
        </CreateItem>
    
      </Target>
    
    
      <!-- Build sequence modification -->
    
      <PropertyGroup>
        <CoreBuildDependsOn>
          $(CoreBuildDependsOn);
          CopyIndirectDependencies
        </CoreBuildDependsOn>
      </PropertyGroup>
    </Project>
    

    带导入的示例项目

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      ...
    
      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
      <Import Project="CopyIndirectDependencies.targets" /> <!-- ADD THIS LINE!! -->
    
      ...
    
    </Project>
    

    来源: http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html

答案 1 :(得分:2)

现在我想我将程序集添加到项目X以确保使用项目X将此引用复制到其他项目。这没有发生....所以我尝试设置'复制本地'设置为true。

您还在谈论Microsoft.SqlServer.Types.dll吗?

前段时间我遇到了同样的问题,实际上不应该复制sqlserver类型并重新分配你的安装。 “安装”它的正确方法是下载sql server运行时(它包含在sql server管理工具中,这就是它在本地适用的原因)。

因为它是在不久前,我不是100%确定以下信息是否正确并且可行,但只是尝试仅安装Microsoft® System CLR Types for Microsoft® SQL Server® 2012。在此下载页面上展开“安装说明”并向下滚动到“CLR类型下载...”

使用this link for SQL Server 2008

在目标服务器上安装它。这只会安装运行此类型dll所需的东西...

答案 2 :(得分:1)

可能是微软的答案会很有用: {{3P>