问题标签 [copy-local]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
53 浏览

visual-studio-2008 - Visual Studio 2008:不同 PC 上 CopyLocal 的默认值

我目前正在为一名从事这项工作多年的初级工程师进行培训。它位于 Visual Studio 下的 C# 中,并且有一个解决方案,其中包含多个项目。

其中一个项目生成了一个应用程序,当我在我的 PC 上调试该项目时,它工作正常。另一方面,当他这样做时会引发异常,因为引用没有找到它应该找到的文件。

我们已经确定这是因为该引用在我的 PC 上的 CopyLocal 为 True,而在他的 PC 上为 False。我假设有一种方法可以在 Visual Studio 设置中解决这个问题,因为我们使用 SVN 来确保我们所有的文件都是相同的(并且我们检查了两个 .csproj 文件中的相关节点确实是相同的)。

我到处找,但找不到如何修复他的设置。任何人都可以帮助我吗?

非常感谢,祝您有美好的一天!

0 投票
5 回答
39476 浏览

visual-studio - 在 nuget 包中将内容文件设置为“复制本地:始终”

我在构建后事件中使用此命令从项目中生成了一个 nuget 包。该变量%conf%设置为正确的配置(调试或发布)并且%1是项目名称(例如“MyCompany.MyProject”)。

这个包仅供我们自己使用,它永远不会在 nuget 上发布。它在我们的私有存储库中结束。

在项目中,有一个文件设置为generate action : contentand copy local : always。(我的 Visual Studio 是法语的,所以我不能 100% 确定翻译)。让我们命名它importantfile.xml

在生成的包中,我最终得到了这个结构:

这很好,我想importantfile.xml部署在包中,因为,这个文件很重要!

当我在另一个项目中安装包时,importantfile.xml部署在项目的根目录下。没关系。但它没有设置为copy local : always

我需要importantfile.xmlcopy local : always这个项目中安装我的包。

我怎样才能做到这一点?

备注:

可以在安装软件包后设置copy local : always文件,这没什么大不了的。如果以后对包的更新会让这个属性保持原样,我会接受它,但事实并非如此。更新包时,copy local重置为never(如此所述)。

项目文件夹中有一个 nuspec 文件,这里是:

0 投票
3 回答
3206 浏览

c# - 复制本地=假文件未找到异常问题

嗨,我知道有人问过这个问题,但没有得到答案。当我想使用安装在 C:\Program files (x86)\Dummu_API.dll 上的 dll 时遇到问题

当我运行我的应用程序时,它会引发异常:

无法加载文件或程序集“Dummy_API,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。

我的项目的参考为 Copy Local = false 和特定版本 = false。我的项目也是一个 x86 平台目标。

我不知道为什么我的应用程序找不到程序集。知道发生了什么吗?

0 投票
1 回答
262 浏览

asp.net - 由于“Copy local = false”而引发“FileNotFoundException”异常

我有大约 20 个解决方案,每个解决方案有 5-10 个项目,它们相互引用以及一些第 3 方库。我有一个输出文件夹,它们都是构建的。所以我不想拥有被引用的每个程序集的任何副本(这就是要求)。因此,我已将其中一个项目中的每个引用的 Copy local 设置为 false,并且它在编译时没有引发错误。但在运行时它抛出 FileNotFoundException,说“无法加载文件或程序集'X'或其依赖项之一。系统找不到指定的文件。” 正如我在这个这个中所读到的线程,您可以指定 CLR 搜索的路径,但它们必须是应用程序基础文件夹的子文件夹,并且由于我有 10 个 Windows 服务,这意味着我必须在每个服务的基础中复制引用的程序集文件夹(这不是重点)。

我注意到的一件事是,当项目 A 引用项目 B 时,不仅复制了 B.dll,还复制了 C.dll(从 B 引用)、D.dll 等。奇怪的是当我将 Copy local 设置为 false 以供参考 B 并删除 B.dll 的副本没有问题 - 它设法在输出目录中找到它,但是当我删除 C.dll(或 D.dll)的副本时当问题发生时。因此,我将项目 B 中的 C 引用的 Copy local 设置为 false,但没有帮助。

有人知道为什么会这样吗?

0 投票
1 回答
7946 浏览

c# - 为什么在设置对“copylocal = false”的引用时会出现“System.IO.FileNotFoundException:无法加载文件或程序集”?

情况如下:我正在尝试使用我称之为“TestProject”的测试项目来运行单元测试。它正在另一个项目中测试一个类,我将其称为“Class1”和“Project1”。

Project1 在运行时对各种 dll 进行一些动态延迟加载,我将其称为“TheDynamicDLLs”。Project1 通过查看相对于它自己的构建输出路径的目录来找到这些 dll。

问题的第一部分出现在 TestProject 引用 Project1 时。显然,它将新建的 Project1.dll 复制到其 OWN 构建目录,然后当 Project1.dll 在相对于其位置的路径中查找 TheDynamicDLLs 时,它找不到它们,因为它是从 TestProject 的位置运行的,而不是它的自己的。

为了解决这个问题,我去了 TestProject 的引用,右键单击 Project1 引用,然后打开它的属性。然后我将“复制本地”设置为“假”。我还确保引用的“路径”属性与 Project1 的构建路径相同。

现在我有一个新问题,我什至无法弄清楚它是什么。每当我运行单元测试时,它都会失败并报告“System.IO.FileNotFoundException:无法加载文件或程序集[信息将 Project1 命名为无法找到的程序集]”。

此外,当我尝试调试单元测试时,而不是仅仅运行它,它永远不会引发异常、抱怨或任何事情,从而阻止我找到有关该问题的任何进一步信息。我在测试报告中也找不到任何有用的信息。

这是带有名称的完整测试报告,出于保密目的,这些名称已被换掉:

从日志来看,TestProject 似乎仍在尝试从其 OWN #$%^ing 构建路径加载 Project1 的 dll,尽管我明确告诉它不要复制本地。(咕噜……)

我究竟做错了什么?

0 投票
2 回答
8430 浏览

c# - 项目引用的“复制本地”是否可传递?

写。提议的欺骗:由于这里的问题与链接的问题相反,我宁愿认为它不是欺骗。

首先,我确实阅读了“复制本地”和项目参考的最佳实践是什么?(也是这个),无论如何我都必须尝试一下,但是获得关于这个的一般反馈似乎是必要的,因为关于这些东西的文档太可怕了,我只在 VS2010 上,也许他们在更新的版本中改变了一些东西很高兴知道。

其次,我只对这个问题的项目参考感兴趣,因为我读到 GAC 的程序集处理方式不同,而 GAC 与我的问题无关。

第三,在阅读了建议的欺骗之后,但更多的是@Albireo 的好答案,区分文件依赖项似乎也很重要,其中依赖项引用 dll 程序集文件和项目依赖项(即我在问什么about),其中依赖项引用一个项目并隐含该项目的输出文件。

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

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

DLL 程序集都已设置Copy Localfalse它们的项目引用,因为它们都构建到相同的输出目录。

2 个可执行项目已将它们直接引用的所有 DLL 程序集项目引用设置Copy Localtrue,以便将 DLL/x1 /x2分别复制到其中。

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

例子:

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

因此,我们有一个逻辑依赖关系one.exe -> a.dll -> b.dll -> c.dll,其中只有a.dll很明显被复制到的输出目录one.exe另外两个dll也会被复制到输出目录吗? 这是在某处记录的吗?


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

0 投票
1 回答
27972 浏览

.net - MSBuild ProjectReference:private ("Copy Local") - 允许的值和行为是什么?

TL;DR是否有任何官方文档详细描述<private>/“复制本地”选项如何与 MSBuild 一起使用?应该包含哪些价值观?


当您将Visual Studio 中一个项目的项目引用添加到另一个项目时,它会将一个添加<ProjectReference Include=".....csproj">.csprojMSBuild 文件中。

当您将来自 Visual Studio 中的一个项目的文件引用添加到文件系统中的程序集文件时,它将添加<Reference Include="Foo"> <HintPath>....Foo.dll</HintPath> ....csprojMSBuild 文件中。

这两种情况下,对于 Visual Studio Setting ,都会添加Copy Local = True|False一个子元素<Private>True</Private>or 。<Private>False</Private>

Reference并且ProjectReference似乎记录在Common MSBuild Project Items下:

你会注意到,

  1. ProjectReference 根本不记录<private>项目
  2. Reference 没有列出 TrueFalse作为可能的值。

所以。嗯?是否有任何官方文档(我会对一个好的博客条目感到非常满意)详细描述了该<private>选项的工作原理?医生只是大错特错还是还有更多?


我的 VS 2013 Express 的示例片段在这里:

0 投票
3 回答
2875 浏览

c# - 如何将解决方案中的所有项目设置为复制本地 false

有没有一种快速的方法可以将所有解决方案项目引用标记为 Copy local false?有什么工具可以做到这一点吗?手动标记大约 200 个项目非常麻烦

0 投票
0 回答
61 浏览

.net - 如何保证一个项目具有它所引用的项目的所有引用?

考虑一个包含许多类库项目的解决方案。他们每个人都安装了一堆 NuGet 包,并且每个项目都有一个单元测试项目。请记住,类库项目的引用配置为Copy Local = false,如何确保单元测试项目始终至少具有原始项目的所有引用?

我们已经被这个问题困扰过好几次了。由于缺少 dll,我们的夜间构建突然失败,当我们检查发生了什么时,通常是有人添加了新的包或对项目的引用,但没有在单元测试项目中安装相同的引用。该问题往往不会表现出来,因为在开发机器中,每个项目都将其输出复制到单独的文件夹中。但是,在 TFS 中构建时,MSBuild 会被覆盖,并且所有输出都放在同一个文件夹中。

我们在Copy Local = false不需要直接执行的所有内容上使用该策略(即,只有测试项目和 Web 应用程序配置为复制本地所有引用)。这样做是为了避免不必要的 dll 副本并加快构建过程。通过使用Copy Local = false,我们需要显式添加对每个项目的所有引用,因为它们不会自动从引用的项目中复制。对于单元测试项目,这通常意味着我们packages.config在测试项目中的文件包含来自原始项目的所有包,以及测试特定的 dll,如模拟框架等。

就个人而言,我喜欢需要明确指定所有引用,因为它使某人更容易看到正在发生的事情以及更清楚地取决于什么。过去我们也遇到过默认设置问题Copy Local = true,所以我不太喜欢将其更改回默认设置。但是有时我们会偶然发现一个问题,该问题与未添加所需引用的人有关。

我可以以某种方式强制执行此操作,这样就不可能在给定项目中没有来自依赖项目的所有引用吗?理想情况下,我希望它是一个编译错误,但任何形式的强制执行都是有益的。如果解决方案中的每个项目在相互引用时都表现得像 NuGet 包,那将非常酷:使用 NuGet 包,您始终可以确保所有引用都是正确的,因为依赖项在 nupkg 中明确说明并添加到任何添加的项目中原包装。

0 投票
1 回答
1949 浏览

c# - 引用 dll 而不复制它们 C#

当我们新建一个 C# 项目并引用一个 dll 时,该 dll 会在编译项目时复制到项目的输出目录中。

有没有办法引用 dll 文件而不是将它们复制到项目的输出目录,并在运行时让可执行文件与它们一起工作(Assemblies如果我没记错的话)?

我尝试访问引用 dll 的属性,并将其更改Copy LocalFalse但没有帮助(可能是因为该 dll 取决于位于 dll 目录中的其他 dll)。

有没有办法做到这一点?