Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使构建过程独立于GAC_.net_Visual Studio 2005_Gac - Fatal编程技术网

.net 使构建过程独立于GAC

.net 使构建过程独立于GAC,.net,visual-studio-2005,gac,.net,Visual Studio 2005,Gac,如何使.NET项目的构建过程(Dev Studio 2005)完全独立于GAC上运行它的特定机器上安装的内容 下面是我们试图解决的问题:根据GAC中安装了哪些程序集,我们的构建过程会在输出目录中生成不同的.NET程序集,然后用于构建.MSI 这大概是因为dev studio假设,因为它安装在GAC中,所以不应该作为我们产品的一部分进行安装 我们希望禁用此行为,以便将项目直接或间接引用的所有.NET程序集复制到项目的输出目录中(除了.NET 2.0运行时标准程序集) 对于直接程序集引用,我知道设置

如何使.NET项目的构建过程(Dev Studio 2005)完全独立于GAC上运行它的特定机器上安装的内容

下面是我们试图解决的问题:根据GAC中安装了哪些程序集,我们的构建过程会在输出目录中生成不同的.NET程序集,然后用于构建.MSI

这大概是因为dev studio假设,因为它安装在GAC中,所以不应该作为我们产品的一部分进行安装

我们希望禁用此行为,以便将项目直接或间接引用的所有.NET程序集复制到项目的输出目录中(除了.NET 2.0运行时标准程序集)

对于直接程序集引用,我知道设置“Copy Local=True”可以实现这一点

但是,这不适用于间接程序集引用

i、 我们的一个项目引用了一个名为“A.dll”的程序集,该程序集依赖于另一个名为“B.dll”的程序集,该程序集与“A.dll”位于同一目录中。在GAC中未安装“B.dll”的计算机上,A.dll和B.dll都会复制到Dev studio构建过程中的输出目录。这就是我们想要的


但在GAC中安装了B.dll的计算机上,即使A.dll的“Copy Local=True”,B.dll不会被复制到输出目录中。

最简单的答案是明确的:添加对B.dll的引用,并按您希望的方式进行设置。

我认为您可能不应该依赖Visual Studio生成过程来自动执行此操作,特别是当结果可能因构建机器而异时


在这种情况下(无论您是使用Visual Studio还是使用自动生成脚本进行生成),我都会做的是让一些生成后脚本(为了简单起见,我通常使用批处理文件)在生成后立即将项目所需的所有程序集复制到适当的目录中(我通常将不属于我的项目的任何程序集都保存在源代码管理的目录中,以便它们都在一个地方)。然后,当您构建安装程序时,所有内容都在它需要的地方。

就像Marc建议的那样,唯一的方法是添加依赖引用并设置CopyLocal=True

但是我同意Danny的回答-不要使用Dev Studio进行部署,因为您无法对构建过程进行足够的控制

为什么?Dev Studio有一些“默认”逻辑,如果它已经计算了属性的值,那么它就不会将其保存到.CSPROJ文件中,让另一台机器上的Dev Studio实例将属性“默认”为其他内容

唯一无错误的方法是直接显式编辑.csproj xml文件,并确保已将True添加到引用元素:

<ItemGroup>
    <Reference Include="ConfigManagerClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=20fc1ffb797ec904, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\thirdparty\CM\ConfigManagerClient.dll</HintPath>
    <!-- If DevStudio inferred this to be true, then it won't explicitly save it.
         When the project is loaded on another machine on which the assembly is
         installed in the GAC,
         Dev Studio on _that_ machine will infer that CopyLocal should be False!!
     -->
    <Private>True</Private>
</Reference>

假的
..\..\thirdparty\CM\ConfigManagerClient.dll
真的
这种行为似乎使我们几乎不可能知道您的.CSPROJ文件在另一台机器上运行时将执行什么操作


从长远来看,您最好不要将构建和打包过程委托给Dev Studio,而只使用Nant和显式命令行。

我遇到了相反的问题。我的构建框在gac中没有任何内容,因此太多内容被发布到我的web应用程序中