为啥将 dll 从 GAC 复制到 project\bin 文件夹

Posted

技术标签:

【中文标题】为啥将 dll 从 GAC 复制到 project\\bin 文件夹【英文标题】:Why a dll is copied from GAC to project\bin folder为什么将 dll 从 GAC 复制到 project\bin 文件夹 【发布时间】:2013-10-25 16:45:30 【问题描述】:

有以下情况:

Windows 7 64 位 Visual Studio 2010 在 asp.net 2.0 中包含项目的解决方案 在文件夹中: C:\Program Files (x86)\Reference Assemblies\CompanyName\ 我有文件: Aaa.dll Aaa.pdb Aaa.xml (xmldoc) 我的解决方案中的任何项目都没有引用该dll(实际上我的解决方案中只有一个项目

问题是每次我构建 dll、pdb 和 xml 都会复制到 bin 文件夹中,然后我得到:

Could not load file or assembly 'Aaa.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format.

如果我在运行程序之前没有删除 dll。

我从未遇到过类似的问题,也不知道如何诊断。有什么建议吗?

编辑:我忘了提及。此 dll 未在项目的参考中引用。 (我在 Visual Studio 项目资源管理器中看不到它: 我的解决方案 -> 我的项目 -> 参考

编辑(@chappo 感谢您的新见解) 运行 MsBuild 我看到了:

_CopyFilesMarkedCopyLocal:
  Copying file from "C:\MyCompany\MyProjects\Project1\App_Code\AjaxControlToolkit.dll" to "bin\AjaxControlToolkit.dll".
  Copying file from "C:\Program Files (x86)\Reference Assemblies\MyCompany\Aaa.dll" to "bin\Aaa.dll".
  Copying file from "C:\Program Files (x86)\Reference Assemblies\MyCompany\Aaa.pdb" to "bin\Aaa.pdb".
  Copying file from "C:\Program Files (x86)\Reference Assemblies\MyCompany\Aaa.xml" to "bin\Aaa.xml".

dll确实被标记为复制本地现在的问题是在哪里?

【问题讨论】:

尝试在引用中将复制到本地属性设置为 false。 对不起,我忘了提到这个dll在项目中没有被引用。感谢您提及,但事实并非如此。 "dll 在我的项目中没有被引用" - 必须从某处 引用它,否则它不会神奇地出现。 那不是一个包含已编译形式网页的dll吗?下载jetbrains.com/decompiler打开.dll反编译看看代码。 看起来它是由 devenv 复制的传递运行时引用。当您尝试使用 MSBuild 从命令行构建解决方案时,是否会发生同样的情况? 【参考方案1】:

我曾经遇到过类似的问题。由于您有 64 位系统,请检查“Aaa.dll”是否为 32 位 dll。如果是,那么您必须在 IIS 中更改应用程序池设置以启用 32 位应用程序。

您可以在此处找到详细说明:https://help.webcontrolcenter.com/KB/a1114/how-to-enable-32-bit-application-pool-iis-7-dedicatedvps.aspx

【讨论】:

实际上这是解决阻碍开发问题的方法。你是对的,并得到了答案。虽然我仍然不知道为什么每次构建时都会复制它,但我不想过多介绍细节。我对当前的解决方案感到满意。 dll 被复制,但我可以运行我的应用程序。【参考方案2】:

尝试清理您的解决方案文件。

转到构建标签 点击清洁解决方案 然后点击构建解决方案

我很久以前就有过这样的经历。但就我而言,我的一个项目无法找到另一个项目的 .dll。我搜索了答案,我只是想出了使用这种方法。 也试试看这里。 Rebuild Visual Studio Library Project Reference

【讨论】:

清理、重建等没有帮助 删除 .pdb 文件并重建解决方案文件怎么样?

以上是关于为啥将 dll 从 GAC 复制到 project\bin 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GAC 中提取程序集?

将 DLL 安装到全局程序集缓存(GAC)

使用 sharepoint 2007 在 Gac 或 bin 中的 Web 部件 dll

GAC(Global Assembly Cache)注册/卸载 dll

共享程序集GAC

将策略文件添加到 GAC 时出错