项目引用的“复制本地”是否可传递?WRT。建议的骗局:由于这里的问题暗示了一个相关的问题,我宁愿认为这不是骗局。首先,我确实阅读了“复制本地”和项目参考的最佳实践是什么?(也是这个)无论如何我都会尝试这个,但是获得一般反馈似乎是必要的,因为关于这些东西的文档很糟糕,我只在VS2010上,也许他们改变了新版本的东西,很高兴知道.其次,我只对这个问题的项目参考感兴趣,因为我读过GAC以不同方式处理程序集,而GAC与我的问题无关。第三,在阅读了建议的骗局之后,但这里有更多@Albireo的好答案,区分文件依赖项似乎也很重要,其中依赖项指的是dll程序集文件,以及项目依赖项(即我所问的)关于),其中依赖项引用项目并隐式引用项目的输出文件。不管怎样,我认为这是一个有点奇怪的情况,但仍然是:对DLL程序集的所有项目引用都将CopyLocal设置为false,因为它们都构建到相同的输出目录。2个可执行项目将它们直接引用的所有DLL程序集项目引用的CopyLocal设置为true,以便将DLL分别复制到/x1/x2。现在的问题是。到可执行项目不直接引用的DLL,但仅传递给引用的程序集:当“CopyLocal”设置为“CopyLocal”时,仅通过另一个程序集传递的程序集被复制到可执行文件的第一个程序集是否为真在输出文件夹中?示例:dlA.csproj(例如Output=lib/a.dll)dlC.csproj(例如Output=lib/c.dll)因此,我们有一个逻辑依赖关系one.exe->a.dll->b.dll->c.dll,其中只有一个.dll显然被复制到一个.exe的输出目录。其他两个dll是否也复制到输出目录中?这在某处记录了吗?而且,是的,我试过了。而且,是的,它似乎有效,但我看起来还不够努力,可能还有更多我可能错过的东西。(还有问题。任何官方文档。)区分文件依赖项似乎也很重要,其中依赖项指的是一个dll程序集文件,以及项目依赖项(这就是我要问的),其中依赖项指的是一个项目,隐式引用该项目的输出文件项目。不,不。MSBuild不关心引用是否指向解决方案中的另一个项目或DLL。如果ProjectA依赖于ProjectB来构建ProjectAProjectB必须已经构建(并且是最新的),则MSBuild将提取其DLL(而不是其C#代码)并将其链接到ProjectA。为方便起见,添加项目引用而不是DLL是“语法糖”:MSBuild知道它必须选择引用项目的输出,无论该输出是什么。否则,您必须手动预构建依赖项,找到它们的DLL并将它们链接到项目,每次切换构建配置、移动或重命名它们时都重复该过程。不太实用。其他两个dll是否也复制到输出目录中?如果直接从引用程序集的项目中使用依赖项中的任何类型的元素,则将复制该引用。此解决方案布局可能是一个示例:使用此依赖链:如果构建此解决方案,您会注意到在MySolution.ConsoleApplication输出目录中将有MySolution.FirstDependency、MySolution.SecondDependency和MySolution.ThirdDependencyDLL,但没有MySolution.FourDependencyDLL。为什么会这样?当MSBuild构建MySolution.SecondDependency时,它注意到依赖项MySolution.FourthDependency被声明为MySolution.FourthDependency,但是由于它在MySolution.SecondDependency代码中找不到MySolution.FourthDependency中任何类型的元素的任何用法,它决定执行一些“优化”并从输出中省略MySolution.FourthDependency程序集。当我通过NuGetAutoMapper添加到“深度依赖项”时,同样的问题让我感到困惑:添加AutoMapper会添加两个程序集引用,AutoMapper和AutoMapper.Net4,其中第二个程序集在需要执行时通过第一个反射加载某种操作.NETFramework4中引入的新集合对象。由于第二个程序集是通过反射加载的,因此MSBuild认为它未被使用并且不需要复制它。所以,是的,只要你直接使用它们而不是通过反射,它们就会被复制。这在某处记录了吗?这种行为似乎是MSBuild的一个“特性”,当我遇到这个问题时,我设法从微软的人那里找到了一些博客文章,但我找不到了。它很简单,与CopyLocal无关。MSBuild查看程序集的元数据以查看程序集的依赖项。那么,您可以在程序集上运行ildasm.exe,然后双击Manifest。一定要试试这个以获得洞察力。您将看到.assembly指令。在构建程序集时由编译器插入,仅列出您在代码中实际使用的引用程序集。如果MSBuild可以在同一目录中找到这样的程序集,那么它将自动复制它。如果没有,那么它会默默地跳过副本。由此,您可以推断出故障模式。它不能复制非托管DLL,它们不会出现在元数据中。它无法通过Assembly.Load/From()复制您具有间接依赖性的程序集,它们也不会出现在元数据中。它无法复制尚未构建的程序集,即构建顺序问题。并且它无法复制CopyLocal属性设置为False的程序集。如果一个程序集存在于GAC中,通常只有一个有效的选择,不需要复制。对于这种情况,您需要帮助,XCOPY在构建后事件中完成工作。以上是C#学习教程:项目引用的“复制本地”是否可以迁移?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
