Asp.net 错误BC30002-未定义XXX类型

Asp.net 错误BC30002-未定义XXX类型,asp.net,vb.net,compiler-errors,Asp.net,Vb.net,Compiler Errors,好了,这开始让我发疯了。我有一个asp.net网络应用程序。非常简单,大部分代码在.aspx.vb中,一些类在App_代码中 直到今天才开始出现的问题(即使大部分代码已经编写好)是,偶尔会出现以下错误消息: 错误BC30002:未定义类型“XXX” 每次我修改App_Code文件夹中的文件时,都会发生此错误。编辑:好的,如果我暂时不触摸任何东西,然后刷新页面,也会发生这种情况。我仍在试图弄清楚如何触发这个错误 我只需要等一会儿,不碰任何东西,然后刷新页面,它就可以工作了,但这很烦人 所以我找了一

好了,这开始让我发疯了。我有一个asp.net网络应用程序。非常简单,大部分代码在.aspx.vb中,一些类在App_代码中

直到今天才开始出现的问题(即使大部分代码已经编写好)是,偶尔会出现以下错误消息:

错误BC30002:未定义类型“XXX”

每次我修改App_Code文件夹中的文件时,都会发生此错误。编辑:好的,如果我暂时不触摸任何东西,然后刷新页面,也会发生这种情况。我仍在试图弄清楚如何触发这个错误

我只需要等一会儿,不碰任何东西,然后刷新页面,它就可以工作了,但这很烦人


所以我找了一点,但除了丢失的进口品外,什么也没找到。有什么想法吗?

听起来像是预编译问题,特别是因为您提到您得到了错误,然后等待它消失。ASP.NET可能仍处于动态编译应用程序的过程中,或者它已将类型编译到不同的程序集中

使用动态编译,不能保证将不同的代码隐藏文件编译到同一程序集中。因此,您引用的类型可能无法在其预编译程序集中解析

尝试使用“@Reference”指令向运行时指示页面和包含类型的文件应编译到同一程序集中


听起来好像每次网站启动时都会发生这种情况(每次您触摸应用程序代码时,应用程序都会被回收,而且您可能已经将IIS配置为在X分钟不活动后关闭网站)

我打赌这与asp.net工作进程在服务器上没有正确的访问权限有关。因此,它试图加载程序集,但被拒绝


表19.3列出了工作进程帐户必须访问才能正常工作的所有文件夹。别忘了授予它虚拟目录中所有文件和文件夹的权限

我想我找到了问题所在

我的代码是这样的:

Imports CMS

Sub Whatever()
    Dim a as new Arbo.MyObject() ' Arbo is a namespace inside CMS
    Dim b as new Util.MyOtherObject() ' Util is a namespace inside Util
End Sub
我不知道为什么要这样写,但事实证明,我调用类时既没有调用它们的整个名称空间,也没有导入它们的整个名称空间,这触发了错误

我这样重写:

Imports CMS.Arbo
Imports CMS.Util 

Sub Whatever()
    Dim a as new MyObject()
    Dim b as new MyOtherObject()
End Sub

现在它工作了…

在我将一个新项目添加到一个旧解决方案后,这种情况发生在我身上。我降低了目标框架以匹配其他“较旧”项目的框架,错误消失。

如果引用相等,请先从备份中替换vbproj和vbproj.user文件。

检查编译器警告(Visual Studio的输出窗口)“警告:以下程序集依赖于高于目标的.NET Framework版本,并且在运行时可能无法正确加载,从而导致失败。”“。当您的某个DLL使用较新版本的dotnet编译时,会发生这种情况。如果当前项目设置为使用较低版本的dotnet,则依赖关系链将阻止加载dll(具有较高的dotnet版本)。它在Visual Studio中出现编译错误,但仍可在IIS中运行。

假设您有一个包含两个项目Foo和Bar的解决方案,并且您在Foo中工作,而XXX(来自您的问题)是Bar的一部分。在您尝试引用Foo中的Bar.XXX之前,我们需要添加Bar作为对Foo的引用,对吗?如果添加Bar.dll(来自Bar的bin/obj文件夹)作为参考,则问题中给出的错误偶尔会出现。通过将条形图添加为Foo的“项目参考”(即,在projectfoo下,右键单击References>addreference>Projects>tickbar)来修复此问题。我刚刚遇到一个使用VB库的旧VB程序,目标框架不匹配。更改程序中的设置以匹配DLL对我有效。