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

Kon*_*tin 12 asp.net clr visual-studio

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

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

Don*_*Don 12

您可以在引用上将"复制本地"属性设置为"True".这应该将它添加到bin文件夹 - 在Web应用程序项目上.

但是对于Web站点项目,当您添加引用时,它所做的就是在引用程序集的web.config中添加一行.它将首先在bin文件夹中查找此文件,然后在GAC中查找未找到的文件.

您有两个选择:要求将程序集安装在目标计算机上的GAC中(在这种情况下,无法进行XCOPY部署)或在bin文件夹中包含所有必需的程序集,方法是复制它们或编写后构建这样做的脚本.您可以使用命令提示符找到.dll,然后转到c:\ windows\assembly\GAC,找到您感兴趣的程序集,进入该目录,然后使用您感兴趣的版本cd进入目录.将为您提供在构建后脚本中使用的路径.例如,对于GAC中的辅助功能部件,您最终会得到以下路径:c:\ Windows\assembly\GAC\Accessibility\1.0.5000.0__b03f5f7f11d50a3a\Accessibility.dll

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


Lor*_*its 6

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

这将解决MSBuild的构建问题,服务器将期望dll位于GAC中..refresh文件将从正确的相对路径获取文件以正确执行构建.