错误 CS0433“Type 'X' already exists in both A.dll and B.dll”的来源是什么?

87

在使用Visual Studio 2008 SP1内置的Web服务器(而非IIS)运行Web应用程序时,出现上述错误。

完整的错误信息(源文件Default.aspx.cs):

  

编译器错误消息:CS0433:类型'WebApplication3.Site1'存在于以下两个位置: 'c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ root \ aa563bcf \ 59deedc0 \ App_Web_site1.master.cdcab7d2.muczzy9v.dll'和   'c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ root \ aa563bcf \ 59deedc0 \ assembly \ dl3 \ 44c3a3cf \ 80dd34ed_6968ca01 \ WebApplication3.DLL'

前面的警告:

  

警告:CS0436:'WebApplication3._Default'类型在以下两个位置冲突: 'c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ root \ aa563bcf \ 59deedc0 \ App_Web_default.aspx.cdcab7d2._tlkwdos.0.cs'中的导入类型   与   'c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ root \ aa563bcf \ 59deedc0 \ assembly \ dl3 \ 44c3a3cf \ e096e61c_6568ca01 \ WebApplication3.DLL'中的类型'WebApplication3._Default'冲突。使用在'c:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ root \ aa563bcf \ 59deedc0 \ App_Web_default.aspx.cdcab7d2._tlkwdos.0.cs'中定义的类型。

警告的源指向一个中间文件App_Web_default.aspx.cdcab7d2._tlkwdos.0.cs

Line 162:    
Line 163:    [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
Line 164:    public class default_aspx : global::WebApplication3._Default, System.Web.IHttpHandler {
Line 165:        
Line 166:        private static bool @__initialized;

我的问题是:这是从哪里来的?

这个Web应用程序(而不是网站!)有一个Default.aspx和一个Site1.Master,没有依赖项。它们几乎是空的,页面上只有一个asp:Label标签。之前,这个Web应用程序运行良好。当我删除Default.aspx.cs中关于Master的任何引用时,一切都很顺利。Master只有一些代码。

实际上,这是许多小型测试Web应用程序之一,所以我并不在乎。但我以前从未见过这种情况,现在我很想知道该怎么做,除了将代码复制到新项目中(清理解决方案无效)。

注意:我已经阅读了这篇文章和其他一些文章,它们都不适用。


我的主要想法是:某些东西损坏了临时目录,我现在的主要解决方法是手动删除临时目录并重新构建。还没有尝试过(这样会删除“证据”),以防有人在这方面有更深入的见解。 - Abel
26个回答

2
我发现另一个原因:工具箱中的图标版本与项目引用中的版本不同。在将对象插入某些表单后,错误就开始了。

1
为了解决歧义,您可以为其中一个引用元素定义别名。
在目标项目文件 .csproj 中添加以下项:
<ItemGroup>
    <Reference Include="WebApplication3.Site1">
      <Aliases>MyAssembly</Aliases>
    </Reference>
</ItemGroup>

然后,您可以像下面这样使用 WebApplication3.Site1
using MyAssembly;

1

执行“清理解决方案”后再执行“重新生成解决方案”也可以解决此问题。


正如我在问题中所解释的那样,至少在我的情况下,清理解决方案并没有起到帮助作用。原因是错误是由临时 ASP.NET 文件引起的(如第一和第二个答案中所解释的),这些文件在执行“清理解决方案”时不会被清除。 - Abel

0
我正在将一个旧的asp.net(v1或v2)网站转换为在.net 4.5下作为Web应用程序运行。
我的解决方案是将导致问题的用户控件事件处理程序委托移动到单独的物理文件中:
//move this line to a new physical file:
public delegate void LocationSearchedEventHandler( object sender );

public partial class controls_Drives_LocationAddPanel : UserControl
{
    public event LocationAddedEventHandler LocationAdded;
    protected virtual void OnLocationAdded(LocationAddEventArg e)
    {

0
一个超级快速和方便的解决方法是通过在某个地方临时引用类来滥用Visual Studio的令人难以置信的智能感知功能。
例如:
System.Runtime.CompilerServices.ExtensionAttribute x = null;

在构建或将光标悬停在行上时,您可以查看以下错误:

'System.Runtime.CompilerServices.ExtensionAttribute' 存在于两个位置 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'

这告诉您立即引起冲突的两个来源。

System.Core.dll 是您想要保留的 .dll 文件,因此删除另一个文件。

我发现我的文件位于 bin 目录中,但它可能在项目的其他位置。

事实上,这值得记住,因为由于 bin 目录可能不包括作为 TFS 更改集的一部分,这可以解释为什么提交更改并不能解决团队中其他成员的问题。


0

这个问题有很多原因。而且上面提到的大部分原因适用于不同的情况。我注意到的是,只有在身份验证设置为“无”以外的其他选项时才会出现错误。为了我的测试目的,我将关闭它,然后它就可以正常工作。


0

我遇到了两个ascx控件具有相同的类名的问题:

控件1: <%@ Control Language="C#" ClassName="myClassName" AutoEventWireup="true ...> 控件2: <%@ Control Language="C#" ClassName="myClassName" AutoEventWireup="true ...>

我通过简单地重命名类名来解决它:

控件1: <%@ Control Language="C#" ClassName="myClassName1" AutoEventWireup="true ...> 控件2: <%@ Control Language="C#" ClassName="myClassName2" AutoEventWireup="true ...>


0
在我们的情况下,问题出在IIS中两个网站的.dll版本不同。它们在IIS中彼此放置,让您通过子域名访问其他网站。它从第一个web.config继承,并与下一个web.config结合使用时,由于mvc.dll的版本不同而失败了。

0
除了尝试2Toad的答案外,我最终还不得不关闭Visual Studio并删除我的.vs文件夹。之后,一切都构建正确。
顺便说一句,我遇到的错误根本没有指定我的Temp文件夹,但是引用了其他明显是系统生成的东西。我忘记保存具体的错误信息了:\

0

当我点击CS0433错误URL的第一个Google搜索结果时,我被重定向到了这里。

'Package'类型同时存在于'Windows... Version=N.N.N.N, Culture=neutral, PublicKeyToken=null, ContentType=Windows...'和'Windows..., Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=Windows...'中

与其概述我为解决此问题所做的所有事情,不如告诉你我是如何破坏它的。我去更新需要代码更新的存储库的NuGet包。这些包相当旧(大约1年左右),我最初尝试的只是为C#项目更新它们。

在开始这个过程和遇到这个错误之间的某个时间点,我以某种方式将该SLN中的C++项目版本降级为目标15063。我还注意到C#项目的TargetPlatformMinVersionTargetPlatformVersion都新设置为10.0.17134.0

我所需要做的唯一事情就是将TargetPlatformMinVersion更改为高于C#项目的TargetPlatformMinVersion。修改C++项目到任何一个版本都不会改变行为。我不确定为什么这突然停止工作,但希望有人能够使用类似的策略解决类似的问题。

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