Visual Studio在多项目解决方案中如何确定要复制到输出目录中的内容?

10 浏览
0 Comments

Visual Studio在多项目解决方案中如何确定要复制到输出目录中的内容?

假设我们有一个具有以下结构的解决方案:\n

    \n

  • Project.DAL - 数据访问层,依赖于一个较低级别的库,例如 Oracle.DataAccess,复制本地设置为 true
  • \n

  • Project.BLL - 业务逻辑层,引用 Project.DAL 作为项目
  • \n

  • Project.UI - 用户界面层,编译为可执行文件,引用 Project.BLL,默认项目
  • \n

\n当编译 Project.UI 时,VS 足够智能,会将 Project.DAL.dll 复制到输出目录,但它并不聪明到足以了解我希望 Oracle.DataAccess 也被复制到输出目录以便分发给客户端。\n有人能解释为什么会这样吗?是因为它在全局程序集缓存 (GAC) 中看到了 Oracle.DataAccess,并假设客户端也会在 GAC 中拥有它吗?\n这并不是什么大不了的问题,但每次我添加一个新的程序集引用时,我都必须记得将其设置为复制本地,并在我的构建脚本中添加一个复制项,这有点让人烦恼。

0
0 Comments

在多项目解决方案中,Visual Studio如何确定将哪些内容复制到输出目录?这个问题的出现可能是因为项目引用的程序集在引用属性窗口中显示为“Copy Local”的状态为“True”,但是DLL文件并没有被复制到输出目录中。尽管之前版本的DLL文件在全局程序集缓存(GAC)中存在,但我认为这并不应该阻止DLL文件的复制。

我发现通过卸载项目并手动编辑项目引用的XML文件可以解决这个问题,具体操作如下:


  {11111111-1111-1111-1111-111111111111}
  Some Project Name
  True

这样,DLL文件就会按预期被复制到输出目录中。我发现,只在属性窗口中将“Copy Local”设置为True,会导致元素完全缺失;而将其设置为False,则会以值“False”存在。

另一种解决方法是手动编辑.csproj文件,将“Copy Local”设置为False,然后执行文件 - 全部保存操作,再将其设置为True并重新构建项目。

0
0 Comments

在多项目解决方案中,Visual Studio如何确定要复制到输出目录的内容?

在多项目解决方案中,当构建项目时,Visual Studio需要确定哪些文件需要复制到输出目录。根据以下两种情况,Visual Studio会将DLL文件复制到输出路径:

1. DLL文件被显式引用,并且CopyLocal属性设置为true。

2. DLL文件被隐式引用,即通过其他已引用的DLL文件间接引用,并且DLL文件不在GAC(全局程序集缓存)中。

需要注意的是,如果文件在GAC中,Visual Studio不会将其复制到输出路径中。这是因为在解析程序集名称时,GAC具有最高优先级,即使本地存在一个(不同的)副本,也会使用GAC中的版本。

建议在设置一个库目录,将所有外部引用的程序集放置在其中。然后,在没有Oracle文件加入GAC(也没有安装Visual Studio)的计算机(或虚拟机)上设置一个自动化的MSBuild脚本。这样,文件将被复制到构建中,并且您可以更好地控制操作,而不是使用Visual Studio时。

需要注意的是,默认情况下CopyLocal的默认值是最近在VS 2015中进行了更改。如果项目文件中未显式指定CopyLocal属性,则使用默认值为true。

如果您想要将一个XSD文件复制到输出文件夹中,您无法直接在代码中引用它。您可以将XSD文件添加为项目中的资源文件,并将其设置为“嵌入的资源”。然后,您可以在运行时从嵌入的资源中提取XSD文件并将其复制到输出文件夹中。

当设置CopyLocal=true时,无论该DLL文件是否存在于GAC中,都会将其复制到输出路径中(即使它已经存在于GAC中)。但是,如果CopyLocal=false,那么该DLL文件不会出现在引用此项目的其他项目的输出路径中。同时,如果您提到的是“DLL文件没有出现在输出路径中,即使CopyLocal=false”,这是因为CopyLocal=false时,该DLL文件确实不会出现在输出路径中。

0
0 Comments

当你的代码中根本没有使用引用的DLL时,Visual Studio会忽略CopyLocal,并且不会将其复制到输出目录中。这在使用依赖注入并且没有直接引用任何具体实现时会变得非常麻烦。虽然有一些解决方法,但它们并不完美。值得一提的是,这是我最终解决这个问题的方式。

0