草庐IT

c# - "Copy Local"是否可传递给项目引用?

coder 2023-07-10 原文

写了。拟议的骗局:因为这里的问题提出了与 linked question 相反的问题,所以我宁愿认为它不是骗局。

首先,我确实阅读了 What is the best practice for “Copy Local” and with project references?(还有 this),无论如何我都必须尝试这个,但是获得对此的一般反馈似乎是必要的,因为关于这个东西的 docs 太可怕了而且我' m 仅在 VS2010 上,也许他们在较新的版本中更改了一些内容,如果知道的话会很高兴。

其次,我只对这个问题的项目 引用 感兴趣,因为我有 read that assemblies from the GAC are handled differently 和GAC 与我的问题无关。

第三,在阅读了建议的骗局之后,但更重要的是@Albireo 提供的漂亮的 answer,看来区分文件 依赖项也很重要,其中依赖项引用一个 dll 程序集文件和 项目 依赖项(即我要问的内容),其中依赖项引用一个 项目 并隐式地引用该项目的输出文件。

无论如何,情况是这样的,我觉得有点奇怪,但仍然:

  • 2个C#可执行项目
  • n 个 C# dll 汇编项目
  • 这 2 个可执行文件具有不同的输出目录,因为它们将单独部署,这样它们在开发人员机器上也是分开的
  • 这 2 个可执行文件依赖于某些 DLL 程序集(它们可能相互依赖)
  • 共有三个输出目录:
    • /x1 可执行 1 项目
    • /x2 for executable 2 project
    • /lib 用于所有 dll 程序集

DLL 程序集所有的项目引用都将Copy Local设置为false,因为它们都构建到相同的输出目录。

2 个可执行项目 已将它们引用的所有 DLL 程序集项目引用的 Copy Local 设置为 true直接复制到/x1 /x2

问题现在是wrt。到可执行项目直接引用,但通过引用的程序集传递的 DLL:Will 程序集,通过另一个程序集传递引用,复制到可执行文件的输出文件夹,当第一个程序集上的“复制本地”设置为 true 时?

例子:

  • x1.csproj(例如 Output = x1/one.exe)
    • 引用:dlA.csproj(例如 Output = lib/a.dll)和 Copy Local = *true*
    • (没有直接引用 b.dll)
  • dlA.csproj(例如 Output = lib/a.dll)
    • 引用:dlB.csproj(例如 Output = lib/b.dll)和 Copy Local = **false**
    • (没有直接引用 c.dll)
  • dlC.csproj(例如 Output = lib/c.dll)
    • (没有进一步的相关引用)

因此,我们有一个 one.exe -> a.dll -> b.dll -> c.dll 的逻辑依赖,其中只有 a.dll 与显然被复制到one.exe的输出目录。 其他两个 dll 是否也被复制到输出目录? 这在某处记录了吗?


是的,我试过了。而且,是的,它似乎 起作用了,但我还没有足够努力地戳它,而且无论如何可能还有更多我可能错过的东西。 (还有关于任何官方文档的问题。)

最佳答案

it would also appear that it is important to differentiate file dependencies, where the dependency references a dll assembly file and project dependencies (i.e. what I'm asking about), where the dependency references a project and implicitly the output file of that project.

不是真的,不是。

MSBuild 并不真正关心引用是指向解决方案中的另一个项目还是指向 DLL。

如果ProjectA取决于 ProjectB build ProjectA ProjectB必须已经构建(并且是最新的),MSBuild 然后将提取其 DLL(而不是其 C# 代码)并将其链接到 ProjectA .

为了方便起见,添加项目引用而不是 DLL 是“语法糖”:这样 MSBuild 就知道它必须选择引用项目的输出,无论输出是什么。

否则,您将不得不手动预构建依赖项,找到它的 DLL 并将其链接到项目,每当您切换构建配置、移动或重命名内容时重复该过程。不太实用。

Will the other two dlls also be copied to the output directory?

如果直接从引用程序集的项目中使用依赖项中的任何类型的元素,则将复制该引用。

一个例子可能是这个解决方案布局:

  • 我的解决方案
  • MySolution.ConsoleApplication
  • MySolution.FirstDependency
  • MySolution.SecondDependency
  • MySolution.ThirdDependency
  • MySolution.FourthDependency

有了这个依赖链:

  • MySolution.ConsoleApplication
  • MySolution.FirstDependency
    • MySolution.SecondDependency
      • MySolution.ThirdDependency
      • MySolution.FourthDependency

如果您构建此解决方案,您会注意到在 MySolution.ConsoleApplication 中输出目录将有 MySolution.FirstDependency 的 DLL , MySolution.SecondDependencyMySolution.ThirdDependency但没有 MySolution.FourthDependency 的 DLL .

为什么会这样? 当 MSBuild 构建时 MySolution.SecondDependency它注意到有一个声明为 MySolution.FourthDependency 的依赖项, 但由于它无法从 MySolution.FourthDependency 中找到任何类型元素的任何用法在 MySolution.SecondDependency它决定执行一些“优化”并省略 MySolution.FourthDependency 的代码从输出中组装

过去,当我通过 NuGet AutoMapper 添加到“深度依赖项”时,同样的问题困扰着我:添加 AutoMapper 会添加两个程序集引用,AutoMapperAutoMapper.Net4 ,当第二个程序集需要对 .NET Framework 4 引入的新集合对象执行某种操作时,第二个程序集由第一个程序集通过反射加载。由于第二个程序集是通过反射加载的,因此 MSBuild 认为它未被使用并且不会懒得复制它。

所以,是的,只要您直接使用它们而不是通过反射,它们就会被复制。

Is this documented somewhere?

这个行为似乎是 MSBuild 的一个“特性”,当我遇到这个问题时,我设法找到了微软一些人的博客文章,但我现在找不到了。

关于c# - "Copy Local"是否可传递给项目引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163368/

有关c# - "Copy Local"是否可传递给项目引用?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  4. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  7. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  10. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

随机推荐