无法加载类型[Namespace].Global,这让我很苦恼。

111

在我的.Net 2.0 Asp.net WebForms应用程序中,我有一个包含以下代码的Global.asax:

<%@ Application CodeBehind="Global.asax.cs" Inherits="MyNamespace.Global" Language="C#" %>

但是当我构建时,出现错误:

Could not load type 'MyNamespace.Global'。

这似乎是因为在 Global.asax 文件中编译器无法看到 MyNamespace 命名空间(在 Global.asax.cs 的代码后台文件中定义)。(在 R# 智能感知中不显示...) 这证明是一个非常难解决的问题...任何帮助将不胜感激!

注意:Global.asax 和 Global.asax.cs 位于同一个文件夹中。

注意2:使用 VS 命令提示符和 csc 进行编译可以正常编译。


其他应用程序页面是否正常工作?有时候这种情况发生是因为Web服务器配置为运行1.1版本,但应用程序编译为2.0版本。 - Noon Silk
是的,“目标框架”是2.0。 - gkdm
34个回答

166

我遇到过的一种导致此问题的情况是,当您通过“构建配置”指定构建平台时。

如果您将x86指定为构建平台,则Visual Studio将自动分配bin/x86/Debug作为此项目的输出目录。这对于其他项目类型来说完全有效,但对于Web应用程序来说则不然,因为ASP.NET希望程序集输出到Bin文件夹中。

在我的情况中,我发现它们被输出到了两个地方(Bin和Bin/x86/Debug),除了一些dll文件,其中最重要的是您的Web应用程序dll文件,它在Bin文件夹中丢失,原因不明。

这显然会导致编译问题,进而导致“无法加载类型Global”的异常。清理解决方案并删除程序集对后续构建没有任何影响。我的解决方法是在Web应用程序的项目设置中更改输出路径为Bin(而不是bin/x86/Debug)。


13
另外:尝试关闭并重新打开VS。如果您正在使用内置的调试服务器,则可能会运行不同的网站。打开/关闭将重新注册本地主机端口。 - BradLaney
1
在我的情况下,它想将项目输出放在inetpub\wwwroot\myproject\bin中,但我已经配置了iisexpress以查看myProject\bin。只需更改输出路径即可解决问题。 - shindigo
谢谢,Stantona。这就是对我有用的东西,而且正好赶上我回家了。 - Bill Norman
@Stantona,当我们有多个项目但只有一个输出文件夹时,是否有可能的解决方案? - Jenish Zinzuvadiya
3
将项目的输出路径更改为 bin 文件夹解决了这个问题。感谢你挽救了我的一天! - Tunahan
显示剩余2条评论

18
您是否更改了项目的命名空间?我偶尔会看到这种情况,即我在“项目属性”对话框中更改了命名空间,但Visual Studio没有更改现有代码文件中的namespace声明。

你认为我应该做什么? - gkdm
1
检查您的 .cs 文件中的命名空间,并确保它与 asax 文件中声明的命名空间相同。我怀疑它们会不同... - PhilPursglove
谢谢,这是帮助我的解决方案。我将使用Resharper检查我的解决方案中的所有命名空间。 - Leonard
我更改了我的命名空间,并通过在“项目属性-应用程序”下更改命名空间,然后更改程序集名称和根命名空间来解决了这个问题。没有其他方法奏效。 - pghcpa
我已经在项目属性中进行了更改,并用新的命名空间替换了所有以前的命名空间(但不知何故,它错过了asax.cs中的一个)。重命名后问题得到解决。 (y) - Mahesh
显示剩余2条评论

16

我是asp .net开发的新手,我遇到了类似的问题。

我将这个类更新为partial类后,问题得到了解决。

public partial class Global : System.Web.HttpApplication

1
我不确定为什么我的全局文件缺少这个,但这就是我的问题所在,谢谢! - ginja

10

我重新启动了Visual Studio,错误消失了!


2
同样的方法对我也起作用了。请确保关闭所有打开的 Visual Studio。 - alansiqueira27

5
  1. 右键点击项目解决方案,选择批处理构建。
  2. 然后选择您的项目名称并进行清理和重建。

在VS 2015中对我很有效。现在我可以使用全局事件了。我的Global.asax文件有这一行。

<%@ Application Language="C#" CodeBehind="~/App_Code/Global.asax.cs" Inherits="Global" %>

我创建了一个名为Global.asax.cs的类文件,它位于AppCode文件夹中,看起来像这样:

public partial class Global : HttpApplication
{
    public Global()
    {
        //
        // TODO: Add constructor logic here
        //
    }
}

我希望这可以帮助你


5
这是又一个值得记录的例子。看起来,当您从相同的端口号启动多个网络应用程序时,会出现这种情况。
基本上,我有几个分支正在进行工作,主分支、暂存分支和发布分支。当我切换到暂存分支时,我注意到它正在使用相同的端口地址配置,因此我选择更改它。然后我收到另一个警告,说该预留与另一个已配置的应用程序冲突了。IIS Express服务器对此非常敏感,因为某种原因,它会破坏配置。
仅通过选择第三个未受影响的端口,就可以解决这个问题,因为它将端口映射到一个新的目录映射上(我的分支在磁盘上位于不同位置)。我之所以发现这一点,是因为我试图更改Global.asax指向的类型名称,但即使重新启动服务器后,类型名称也没有改变,因此很明显,我正在更改的代码没有被IIS Express部署所反映。
因此,在您因此失眠之前,请尝试更改当前用于运行Web项目的IIS端口号。

3
我在处理类似问题时遇到了一个相似的错误:

<clear/>

作为第一个子元素,将标签添加为父元素的子元素。
<assemblies>

我在 Web.config 文件中使用了 <location> 标签。我尝试在 IIS 中部署的“默认 Web 站点”下的应用程序中插入这些标签,以防止配置继承。


这确实指引了我正确的方向。结果发现我在父目录中放置了<clear/>,因为那是一个空占位符。我相信真正的问题是它清除了我的应用程序所引用的程序集,从而阻止了应用程序程序集的加载。 - Doug Lampe
我也遇到过这个问题-明确地移除选择的组件而不是清空列表,效果很好。 - Arve Systad

3

检查Global.asax.cs的Build Action。应该设置为Compile。

在解决方案资源管理器中,右键单击Global.asax.cs并转到属性。在属性窗格中,设置Build Action(而不是调试时)。

似乎VS 2008默认情况下不总是正确添加.asax(.cs)文件。


2

虽然这是一篇旧文章,但我在尝试将网站项目转换为Web应用程序项目时遇到了此错误。

请按照这个链接上的说明进行操作。虽然我仍然遇到了global.asax错误,但我只是删除了它,并通过右键单击Visual Studio中的项目并选择添加新项来重新添加它。添加global.asax文件后,问题得以解决。


2
我将我的解决方案从VS2003转换到VS2010,但在转换Web应用程序项目时遇到了问题。
我遇到了完全相同的问题,但是没有一个答案对我有用。
对我有用的是:
- 右键单击解决方案,选择“配置管理器” - 查看“活动解决方案配置”下拉列表中的每个配置。 - 通过选中“生成”复选框将Web应用程序包含在构建中。
似乎在转换期间出现的问题以某种原因将Web应用程序项目从构建中删除了。
希望这个答案能帮助其他遇到相同问题的人...

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