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

Asp.net mvc 尝试执行多项目ASP.Net MVC站点时出现编译错误,asp.net-mvc,Asp.net Mvc,我得到了这个错误 编译错误 描述:编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改源代码 编译器错误消息:CS1704:已导入具有相同简单名称“MyMVCAssembly,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”的程序集。尝试删除其中一个引用或对其签名以启用并排 我的解决方案有两个ASP.NETMVC项目-将主要内容和区域分开。主项目没有参考第二个项目。相反,它在文件夹中获取所有MVC DLL,并将其存储到IOC容器中,该容器负责注册所有

我得到了这个错误

编译错误 描述:编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改源代码

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

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

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

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

我该怎么办


此外,我还有以下设置:

  • 它被设置为使用本地IIS服务器而不是VS Dev服务器
  • 在输出窗口中,我看到本地web服务器正在加载GAC和临时ASP.Net文件文件夹中的所有DLL。我看到的问题是,它还试图从我的解决方案文件夹加载我的DLL文件
  • 你知道为什么它也试图从解决方案中获取唯一的DLL吗?其他项目没有这种行为


    更新:

    有一种奇怪的行为:

    [1] 我清除所有违规集会的副本

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

    [3] 我负责主项目。它工作时没有任何问题,但当然丢失的程序集不会被加载

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

    [5] 我运行解决方案。它又犯错误了

    有人能解释一下为什么它试图从两个不同的地方加载相同的程序集吗

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

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

    我可以这样解释

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

    // 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加载

    您可以执行以下提到的步骤:

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

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

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

  • 用于程序集的探测器(有关更多信息,请参阅下面提到的文章)

  • 有关更多信息,请查看


    我希望这将对您有所帮助。

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

    我在Microsoft网站上找到了这个解释。我想弄明白的是为什么它要插入同一个程序集两次。我没有任何类或解决方案可以在不同的位置创建相同的DLL,然后将其复制。@JonaSarAngel为什么不为一个程序集(导致错误的程序集)指定一个强名称?是的,刚刚尝试过。正如所料,它给出了一个关于重复引用的错误。已导入具有相同标识“MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=2031ed7ef42c08b6”的程序集。请尝试删除其中一个重复引用。在Visual Studio的“调试输出”窗口中,我看到它正在从“'iisexpress.exe'(托管(v4.0.30319)):加载“C:\WINDOWS\Microsoft.Net\assembly\GAC\ MSIL\…”加载程序集,然后我再次看到它,这次是从我的解决方案文件加载它。为什么要从不同的位置加载同一个部件两次?我甚至没有提到其他项目中的项目。这是它自己的。@JonasArcangel是的。你做了很好的调查。然后试着移除它