4

我收到这个错误。

编译错误描述:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。

编译器错误消息:CS1704:已导入具有相同简单名称“MyMVCAssembly,版本=1.0.0.0,文化=中性,PublicKeyToken=null 的程序集。尝试删除其中一个引用或对其进行签名以并排启用。

我的解决方案有 2 个 ASP.Net MVC 项目 - 拆分主要内容和区域。主项目没有对第二个项目的引用。相反,它获取文件夹中的所有 MVC DLL 并将其存储到 IOC 容器中,该容器负责注册所有控制器。

当我将第二个 ASP.Net MVC 项目的输出设置到主项目的 bin 文件夹中时,出现错误。(我已将区域解决方案中的所有视图设置为始终复制。)

我还尝试了将 DLL 复制到主 bin 而不是设置输出的构建后操作,但结果是相同的。

我应该怎么办?


此外,我有以下设置:

  1. 它设置为使用本地 IIS 服务器而不是 VS 开发服务器。
  2. 在“输出”窗口中,我看到本地 Web 服务器正在从 GAC 和 Temporary ASP.Net 文件夹加载所有 DLL。我看到的问题是它还试图从我的解决方案文件夹中加载我的 DLL 文件。

任何想法为什么它也试图从解决方案中获取唯一的 DLL?对于其他项目,它没有这种行为。


更新:

这是一个奇怪的行为:

[1] 我清除了违规程序集的所有副本。

[2] 我删除了将该程序集复制到我的主 MVC 项目 bin 文件夹的构建后操作。

[3] 我运行主要项目。它可以正常工作,但当然不会加载缺少的程序集。

[4] 我手动将该程序集复制到 mian MVC 项目 bin 文件夹中。

[5] 我运行解决方案。它再次收到错误!

有人可以解释为什么它试图从两个不同的地方加载这个相同的程序集吗?

好的,这可能是问题的线索:因为我将程序集复制到主 MVC 项目的 bin 文件夹,它也被复制到临时 ASP.NEt 文件夹中。同时,由于该项目没有被解决方案中的任何其他项目引用,因此它也在将相同的程序集复制到 IIS 中。我怎样才能防止这种情况发生?如果我排除将程序集复制到主 MVC bin 的步骤,它根本不会加载到 IIS 中。为什么会这样?

4

2 回答 2

1

此错误指出两个引用具有相同的程序集标识,因为所讨论的程序集缺少强名称,它们没有签名,因此编译器无法在元数据中区分它们。因此,运行时会忽略版本和区域性程序集名称属性。用户应该删除多余的引用,重命名其中一个引用,或者为它们提供一个强名称。

可以像下面这样解释。

下面的示例创建一个程序集并将其保存到根目录。

// CS1704_a.cs
// compile with: /target:library /out:c:\\cs1704.dll
public class A {}

下面的示例创建了一个与前一个示例同名的程序集,但将其保存到不同的位置。

// CS1704_b.cs
// compile with: /target:library /out:cs1704.dll
public class A {}

下面的示例尝试引用这两个程序集。下面的示例生成CS1704

// CS1704_c.cs
// compile with: /target:library /r:A2=cs1704.dll /r:A1=c:\\cs1704.dll
// CS1704 expected
extern alias A1;
extern alias A2;

更新

如果两个程序集都是强名称(签名),则 CLR 将始终从 GAC 加载。

您可以按照以下提到的步骤操作:

  1. 通过检查适用的配置文件(包括应用程序配置文件、发布者策略文件和机器配置文件)来确定正确的程序集版本。如果配置文件位于远程机器上,则运行时必须首先找到并下载应用程序配置文件。

  2. 检查程序集名称是否已绑定到之前,如果是,则使用先前加载的程序集。如果加载程序集的先前请求失败,则请求立即失败,而不尝试加载程序集。

  3. 检查全局程序集缓存。如果在那里找到该程序集,则运行时将使用该程序集。

  4. 装配探针(有关更多信息,请查看下面提到的文章)

有关更多信息,请查看运行时如何定位程序集

我希望这对你有帮助。

于 2013-01-13T16:54:08.373 回答
0

我在使用添加了错误引用的测试容器项目时遇到了类似的问题。我删除了它,发现在解决方案清理和重建之后,问题是 bin 目录中的两个 DLL 发生冲突。删除它们并重建一切都很好。

于 2014-02-12T12:57:14.653 回答