Ошибка 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, чтобы указать среде выполнения, что ваша страница и файл, содержащий ваш тип, должны быть скомпилированы в одну сборку.
Проверьте наличие предупреждения компилятора (окно вывода Visual Studio) «предупреждение: следующая сборка зависит от версии .NET Framework, которая выше целевой, и может неправильно загружаться во время выполнения, вызывая сбой». Это происходит, когда одна из ваших DLL скомпилирована с более новой версией dotnet. Если в текущем проекте настроено использование более ранней версии dotnet, цепочка зависимостей предотвращает загрузку dll (с более высокой версией dotnet). Это дает ошибку компиляции в Visual Studio, но все еще может работать в IIS.
Замените ваши файлы vbproj и vbproj.user из резервной копии ранее, если ссылки равны
Похоже, это происходит каждый раз, когда веб-сайт раскручивается (приложение перезапускается каждый раз, когда вы нажимаете app_code, и, вероятно, у вас есть IIS, настроенный на отключение веб-сайта после X минут бездействия).
Могу поспорить, что это связано с тем, что рабочий процесс asp.net не имеет правильных прав доступа на сервере. Поэтому он пытается загрузить сборку и ему отказывают.
Проверьте эту ссылку и таблицу 19.3 для получения списка всех папок, к которым должна иметь доступ учетная запись рабочего процесса, чтобы функционировать. И не забудьте дать ему права на все файлы и папки в вашем виртуальном каталоге!