Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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
为什么ASP.NET网站在添加本地引用时引用GAC中的程序集?_Asp.net_Visual Studio_Clr - Fatal编程技术网

为什么ASP.NET网站在添加本地引用时引用GAC中的程序集?

为什么ASP.NET网站在添加本地引用时引用GAC中的程序集?,asp.net,visual-studio,clr,Asp.net,Visual Studio,Clr,当您使用ASP.NET网站(而不是web应用程序模型)并从本地文件夹添加对程序集的引用时,Visual Studio似乎理解此本地程序集也在GAC中,因此不会将此程序集复制到bin文件夹(与非GAC程序集一样),而只是在web.config文件中添加新记录 为什么会有这样的行为?是否可以强制复制到bin文件夹(我需要它,因为.dll不在目标环境中)?我可以将程序集作为文件添加到bin文件夹中,它会工作,但在这种情况下,bin文件夹内容将在源代码管理中,这不好。您可以在引用中将“复制本地”属性设置

当您使用ASP.NET网站(而不是web应用程序模型)并从本地文件夹添加对程序集的引用时,Visual Studio似乎理解此本地程序集也在GAC中,因此不会将此程序集复制到bin文件夹(与非GAC程序集一样),而只是在web.config文件中添加新记录


为什么会有这样的行为?是否可以强制复制到bin文件夹(我需要它,因为.dll不在目标环境中)?我可以将程序集作为文件添加到bin文件夹中,它会工作,但在这种情况下,bin文件夹内容将在源代码管理中,这不好。

您可以在引用中将“复制本地”属性设置为True。这会将其添加到Web应用程序项目上的bin文件夹中

但是对于网站项目,当您添加引用时,它所做的只是在Web.config中添加一行引用程序集。它将首先在bin文件夹中查找此文件,如果找不到,则在GAC中查找

您有两个选项:要求将程序集安装在目标计算机上的GAC中(在这种情况下,不可能进行XCOPY部署),或者将所有必需的程序集包括在bin文件夹中,方法是将它们复制到或编写生成后脚本来执行此操作。您可以使用命令提示符找到.dll,然后转到c:\windows\assembly\GAC,找到您感兴趣的程序集,将cd放入该目录,然后将cd放入您感兴趣的版本所在的目录。这将为您提供在生成后脚本中使用的路径。例如,对于GAC中的辅助功能程序集,您将得到以下路径: c:\Windows\assembly\GAC\Accessibility\1.0.5000.0\uuu b03f5f7f11d50a3a\Accessibility.dll


你说在源代码管理中包含bin文件夹内容是不好的。对于您构建的二进制文件,这通常被认为是正确的,但在您的情况下,您的二进制资产并没有作为项目的一部分进行编译。从理论上讲,它们相当于图像:二进制资产不是作为项目的一部分编译的。我认为它们和您的项目所依赖的任何其他二进制文件一样属于源代码管理。但这是个人的选择。

在运行时,程序集必须位于两个位置之一:项目的输出路径或全局程序集缓存(请参见使用程序集和全局程序集缓存)。如果项目包含对不在这些位置之一的对象的引用,则在生成项目时,必须将该引用复制到项目的输出路径。CopyLocal属性指示是否需要制作此副本。如果该值为true,则复制引用。如果为false,则不复制引用

CopyLocal的项目分配值按以下顺序确定:

  • 如果引用是另一个项目,称为项目到项目引用,则该值为true
  • 如果在全局程序集缓存中找到该程序集,则该值为false
  • 作为特殊情况,mscorlib.dll引用的值为false
  • 如果在Framework SDK文件夹中找到程序集,则该值为false。 否则,该值为true
  • 希望这有帮助


    s

    有关如何设置web项目(非web应用程序)引用的“复制本地”属性的信息,请参阅:


    如果您在Visual Studio中使用网站项目,并且引用一直将其指向GAC版本而不是其他文件夹(如lib),则需要在/bin文件夹中创建一个
    xxxx.dll.refresh
    文件,其中xxxx是您引用的有问题的dll


    这也将解决MSBuild的生成问题,因为服务器希望dll位于GAC中。.refresh文件将从正确的相对路径获取文件,以便正确进行生成。

    如何设置此属性?当我打开网站的属性页时,我会看到引用列表,但那里没有Copy Local。请注意,这是网站(不是web应用程序),它是引用的属性,而不是网站。但我现在明白了为什么您指定它是一个web站点而不是web应用程序。我将编辑我的答案。我已将此答案标记为已接受,谢谢!但是,我仍然不理解VS的逻辑-如果我添加了本地程序集-为什么在GAC中搜索它,然后从GAC中引用它?web.config中的引用没有指定位置;在运行时,程序集将首先在bin文件夹中查找,如果在本地找不到,则在GAC中查找。如果你把它放在bin文件夹中,它不应该搜索GAC。在VS中添加引用时,.NET选项卡仅显示GAC中的内容。您必须使用“浏览”选项卡来查找本地引用。