Ошибка BC30002 - тип XXX не определен

ОК, это начинает сводить меня с ума. У меня есть веб-приложение asp.net. Довольно просто, большая часть кода в.aspx.vb и несколько классов в App_Code.

Проблема, которая начала возникать только сегодня (хотя большая часть кода уже была написана), заключается в том, что время от времени у меня появляется это сообщение об ошибке:

Ошибка BC30002: тип "XXX" не определен

Ошибка возникает примерно каждый раз, когда я изменяю файлы в папке App_Code. РЕДАКТИРОВАТЬ: ОК, это также происходит, если я некоторое время ничего не трогаю, а затем обновите страницу. Я все еще пытаюсь выяснить, как именно вызвать эту ошибку.

Мне просто нужно немного подождать, ничего не трогая, затем обновить страницу, и она работает, но это очень раздражает.

Поэтому я немного искал, но ничего не пришло, кроме импорта не хватает. Любая идея?

6 ответов

Решение

Я думаю, что нашел проблему.

Мой код был такой:

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

И теперь это работает...

Это случилось со мной после того, как я добавил новый проект в старое решение. Я опустил Target Framework так, чтобы он соответствовал другим "старым" проектам, и ошибка исчезла.

Похоже, проблема до компиляции, особенно потому, что вы упоминаете, что получаете ошибку, а затем ждете, и она исчезает. ASP.NET, возможно, все еще находится в процессе динамической компиляции вашего приложения, или он скомпилировал типы в различные сборки.

При динамической компиляции вам не гарантировано, что разные файлы кода будут скомпилированы в одну сборку. Таким образом, тип, на который вы ссылаетесь, не может быть разрешен в его предварительно скомпилированной сборке.

Попробуйте использовать директиву @Reference, чтобы указать среде выполнения, что ваша страница и файл, содержащий ваш тип, должны быть скомпилированы в одну сборку.

@ Ссылка - MSDN

Проверьте наличие предупреждения компилятора (окно вывода Visual Studio) «предупреждение: следующая сборка зависит от версии .NET Framework, которая выше целевой, и может неправильно загружаться во время выполнения, вызывая сбой». Это происходит, когда одна из ваших DLL скомпилирована с более новой версией dotnet. Если в текущем проекте настроено использование более ранней версии dotnet, цепочка зависимостей предотвращает загрузку dll (с более высокой версией dotnet). Это дает ошибку компиляции в Visual Studio, но все еще может работать в IIS.

Замените ваши файлы vbproj и vbproj.user из резервной копии ранее, если ссылки равны

Похоже, это происходит каждый раз, когда веб-сайт раскручивается (приложение перезапускается каждый раз, когда вы нажимаете app_code, и, вероятно, у вас есть IIS, настроенный на отключение веб-сайта после X минут бездействия).

Могу поспорить, что это связано с тем, что рабочий процесс asp.net не имеет правильных прав доступа на сервере. Поэтому он пытается загрузить сборку и ему отказывают.

Проверьте эту ссылку и таблицу 19.3 для получения списка всех папок, к которым должна иметь доступ учетная запись рабочего процесса, чтобы функционировать. И не забудьте дать ему права на все файлы и папки в вашем виртуальном каталоге!

Другие вопросы по тегам