【问题标题】:.NET Visual Studio build error "another partial declaration of this type exists".NET Visual Studio 构建错误“存在此类型的另一个部分声明”
【发布时间】:2011-07-28 17:36:12
【问题描述】:

我在 Windows 世界中并不是一个特别熟练的开发人员,我遇到了一个需要解释的问题。我希望在我的无知中,我遗漏了一些明显的东西。

我发现自己不得不反向编译预编译的 .NET 网站/应用程序。 Reflection 设法为我提供了我需要的 c# CodeFile,我花了很多时间来更改所有 .aspx 引用,如下所示:

<%@ page language="C#" autoeventwireup="true" inherits="someclassname, App_Web_Z8sdf" %>

对于这样的事情:

<%@ page language="C#" autoeventwireup="true" CodeFile="somefilename.aspx.cs" inherits="someclassname" %>

并将 aspx.cs 文件移动到与 .aspx 文件相同的目录中。

这让我可以在 Visual Studio 中以某种可编辑的形式实际加载项目。我在 2010 年和 2008 年都试过这个。

但是,现在我正在尝试构建这个项目。我得到的错误是:

"Missing partial modifier on declaration of type 'someclassname'; another partial declaration of this type exists"

很公平。我知道可以在多个地方声明类,并且每个都必须具有“部分”关键字才能使其正常工作。因此,我将 partial 关键字添加到发生错误的 aspx.cs 文件中的类定义中。这设法摆脱了该错误消息,并将其替换为

"The type 'someclassname' already contains a definition for 'some variable name".

它显然表现得好像在某个地方有另一个类定义。作为一名 unix 管理员,我开始在项目中的所有文件中搜索与相关类的名称匹配的字符串,并且我恰好在两个文件和两个文件中找到它。包含我引用的第一行的 aspx 文件,以及与之对应的包含类定义的 aspx.cs 文件。现在,我越来越糊涂了。

我阅读了一些论坛帖子,这些帖子表明 Visual Studio 将在其中创建带有部分类的“设计器”文件,这似乎很有希望,但我看不到这些设计器文件,即使我在 VS 中查看所有文件,当我查看磁盘上的目录,或者其他任何地方。显然,我错过了一些东西。也许我没有正确地从预编译的站点进行重构?也许 web.config 或其他文件中有一些设置需要更改?

任何帮助将不胜感激。

根据请求,某个类定义的通用版本

    using System;
    using System.Web;
    using System.Web.Profile;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;

    public class Some_Class_Name : Page, IRequiresSessionState
    {
        /// a bunch of variables defined like this
        protected HtmlForm form1;

       ///a bunch of protected methods defined similarly to this

        protected void LinkButtonReturn_Click(object sender, EventArgs e)
        {
            this.Session.Clear();
            base.Response.Redirect("Default.aspx");
        }

}

更新 这似乎是从预编译网站转换回源代码的结果。 .aspx.cs 文件包含它们不应该包含的控制字段定义(如果这是我天真地称之为“变量定义”的正确术语),并且缺少它们应该具有的部分声明。胡乱猜测,似乎这些定义实际上是由 aspx 文件隐含的,因此 aspx.cs 文件不需要它们。非常感谢 Dan Abramov 和其他所有发表评论的人。

【问题讨论】:

  • 你能发布“someclass”的定义吗?
  • 我可以发布一个通用版本。
  • 我不是 WebForms 人,但您可以在删除所有控制字段(例如 form1)后尝试编译吗?不过我可能大错特错了。
  • 如果您使用的是 Web 应用程序项目(而不是网站项目),那么会生成一个 Foo.aspx.designer.cs 文件,其中定义了每个控件。如果该文件不存在,您应该可以通过右键单击项目并使用“转换为 Web 应用程序”选项来创建它。

标签: .net visual-studio-2010 visual-studio-2008


【解决方案1】:

这个问题有点老了,但是我在使用 Reflector 反编译 .NET 代码时遇到了类似的问题。

您收到这些错误的原因是您的 ASPX 页面上的“CodeFile=...”页面指令。当 ASP.NET 看到 CodeFile 指令时,它会自动生成一个设计器文件(即带有控件定义的部分类)。将 CodeFile 指令更改为 CodeBehind 指令解决了我的所有问题。

希望这可以帮助其他人。

【讨论】:

  • +1 我删除了一个 .designer 文件,它解决了问题。只在两个地方声明了类名。
【解决方案2】:

我可能非常不切实际,但我怀疑编译器会根据aspx 代码本身生成部分类。如果这是真的,那么这些类显然会包含像form1 这样的字段。

我会删除所有控制字段声明,看看这是否有帮助。请注意,我不是 WebForms 专家,所以这是猜测。

【讨论】:

  • 你知道,你可能已经成功了。将我用反射重构的版本与相同代码的旧版本进行比较,aspx.cs 文件缺少任何控制字段定义。删除它们,但保留 partial 关键字(也存在于旧版本的代码中)看起来它正在解决任何冲突。谢谢!我肯定会说这至少回答了这部分问题。
【解决方案3】:

我今天在使用 WCF 实现 Web 服务存根时遇到了一个相关但不完全相似的问题。在为设计原型创建一次性 Web 服务存根和代理时,我无意中将自动生成的代码放在与服务定义代码相同的命名空间中。

我的解决方案是将自动生成的客户端代理移动到它自己的命名空间中,一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多