尝试执行多项目ASP.Net MVC站点时出现编译错误

时间:2013-01-13 08:00:30

标签: asp.net-mvc

我收到此错误。

  

编译错误     描述:编译服务此请求所需的资源时发生错误。请查看以下特定错误详细信息并相应地修改源代码。

     

编译器错误消息:CS1704:已导入具有相同简单名称“MyMVCAssembly,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”的程序集。尝试删除其中一个引用或签名以便并排启用。

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

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

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

我该怎么办?


此外,我还有以下设置:

  1. 设置为使用本地IIS服务器而不是VS Dev服务器。
  2. 在“输出”窗口中,我看到本地Web服务器正在加载GAC和Temporary ASP.Net文件夹中的所有DLL。我看到的问题是它还试图从我的Solutions文件夹加载我的DLL文件。
  3. 为什么它试图从解决方案中获取唯一的DLL呢?它对其他项目没有这种行为。


    更新:

    这是一种奇怪的行为:

    [1]我清除了违规装配的所有副本。

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

    [3]我运行主项目。它没有任何问题,但当然缺少装配不会被加载。

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

    [5]我运行解决方案。它再次出错了!

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

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

2 个答案:

答案 0 :(得分: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.   
  5. 检查全局程序集缓存。如果在那里找到组件,那么   运行时使用此程序集。

  6.   
  7. 装配探头(更多信息请查看下面提到的文章)

  8.   

了解更多信息,请查看How the Runtime Locates Assemblies

我希望这会对你有所帮助。

答案 1 :(得分:0)

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