gpt4 book ai didi

.net - 引用的 DLL 未复制到引用项目

转载 作者:行者123 更新时间:2023-12-04 11:25:38 26 4
gpt4 key购买 nike

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

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

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

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

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

所有 proobjects 构建都在我的开发机器上完美地找到并运行,但是当部署到我们的服务器时,它们无法运行(运行时错误)。该错误非常模糊,因为它指向一个丢失的 FluentNHibernate 程序集,但事实并非如此。

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

到目前为止一切顺利,复制了 DLL 并且它工作了(是的!)。

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

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

有没有办法做到这一点,或者这个 Visual Studio 是否很聪明并且意识到 Project Y 不需要这个 .dll 从而拒绝复制它?

(由于 Project Z 需要实际引用并且 Project X 在运行时加载此程序集,因此 Z 和 X 之间没有“硬”引用)

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

最佳答案

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

  • 套装复制本地对于您希望包含在输出中的所有引用文献。
  • 将复制的间接依赖项代码(见下文)保存到名为 CopyIndirectDependencies.targets 的文件中。并将目标文件放在您的项目目录中。
  • 编辑您的 .csproj.vbproj包含对 .targets 的导入你添加的文件。请参阅下面的示例。
  • 构建您的项目,您应该将辅助依赖项自动复制到构建输出中。


  • 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

    关于.net - 引用的 DLL 未复制到引用项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19133109/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com