Visual Studio 2010的“添加引用”会将dll复制到bin目录吗?

7

我正在使用w7 64位和vs.net 2010。

我正在向我的“添加引用”对话框中的组件添加引用。该组件是第三方dll。

历史上,在w7 32位上,它会在我的web.config(在程序集标记内)中添加一行引用此dll的代码,并且不会将dll复制到bin目录中。

然而,在64位w7上,dll将被复制到bin目录中,而且web.config根本没有更新。

为什么dll会被复制到bin目录中?谢谢

解决方案:(已更新) 这些帖子给了我所需的线索。

如果您的系统找不到GAC中的dll,则VS.NET将把dll复制到bin目录中。 GAC中的程序集(在您的工作站上注册)可以通过查看C:\ Windows \ Assembly目录找到。

在vs.net的“添加引用对话框”中列出的组件可能在gac中也可能不在。因为组件在“添加引用”对话框中列出并不意味着它在您的本地工作站上注册。我导航到组件目录,将所需的dll拖到C:\ Windows \ Assembly目录中。我关闭并重新打开vs.net,然后浏览到相同的文件并单击添加引用。

**这将程序集引用添加到我的web.config中(它也没有将dll复制到我的网站bin目录中)****

3个回答

12

在参考文献中,有一个称为复制本地属性(在属性窗口中),它确定是否将程序集复制到输出目录。

至于为什么这可能对其他引用无关紧要,MSDN说:

如果您部署/复制包含对已注册到全局程序集缓存(GAC)的自定义组件的引用的应用程序,则不管复制本地设置如何,该组件都不会随应用程序一起部署/复制。


在VS.NET 2010中,这是一个网站(而不是Web应用程序),因此解决方案中没有引用文件夹。我只有一个bin目录,如果查看dll的属性,我只有“自动刷新路径”,“文件名”和“完整路径”属性。我没有“复制本地”属性。 - David
@David 如果您将<assembly>条目添加到web.config并删除DLL,您的网站是否正常运行? - bdukes
谢谢,这个答案正是我在寻找的。如果有人想手动进行相同的更改,可以将<Private>True</Private>标签添加到csproj <Reference>元素中。因此,<Reference Include="System"><Private>True</Private></Reference> - Matt Hyde

6

这样可以将副本复制到 bin 目录中,以便可执行文件可以找到它。否则它就无法找到,除非将 dll 安装在 GAC 中。


2
该dll文件位于gac中(因为它在“添加引用”对话框窗口中显示),所以我希望它不会复制该dll文件。 - David
2
+1,这个答案是正确的。添加引用对话框与GAC没有任何关系。它只列出已注册的引用程序集,从不列出来自GAC目录的任何内容。 - Hans Passant

1
此外,关于之前的回答:我认为 Visual Studio 会根据 DLL 是否存在于计算机 GAC 中来确定是否将 Copy Local 属性设置为 true。这样可以防止 VS 复制本地 .net DLLs,因此默认情况下仅复制“自定义”DLL。

这是一个asp.net的“网站”,而不是“Web应用程序”,我无法更改复制本地属性。此外,该组件位于gac中,因此应该只需在web.config中添加对其的引用。不确定为什么,这是否与w7 64位工作站有关? - David
你确定这是一个“网站”吗?我刚刚看到说网站没有Bin文件夹...(http://bit.ly/aOlnfD)。这很奇怪,因为我可以更改Copy Local的值。而且听起来32位和64位的行为不同也很奇怪。可能是因为DLL没有编译成64位,编译器对复制的DLL执行了某些操作(它是否与GAC中的DLL完全相同?)。但这听起来很奇怪。 - Julien N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接