Ошибка ASP.Net: «Тип 'foo' существует как в« temp1.dll », так и в« temp2.dll »


108

При запуске проекта веб-приложения в кажущееся случайное время страница может завершиться с ошибкой CS0433: тип существует в нескольких библиотеках DLL. Все библиотеки DLL - это сгенерированные библиотеки DLL, находящиеся в каталоге «Temporary ASP.NET Files».

Ответы:


135

Добавьте атрибут batch = "false" в элемент "compilation" файла web.config.

Эта проблема возникает из-за того, как ASP.NET 2.0 использует ссылки на приложения и структуру папок приложения для компиляции приложения. Если свойство пакетной обработки элемента в файле web.config для приложения имеет значение true, ASP.NET 2.0 компилирует каждую папку в приложении в отдельную сборку.

http://www.sellsbrothers.com/1995

http://support.microsoft.com/kb/919284


Спасибо за это. Сегодня пытался исправить это на производственной площадке. Пока не знаю, что вызвало это (так долго работало нормально!), Но это устранило проблему для нас.
— Мэтт

Спасибо. Это работает. Проснулся сегодня утром с этой ошибкой. МОЙ ISP Discountasp.net должно быть что-то изменил. Если бы не этот пост, я бы все равно получил ошибку. Не нравится моему интернет-провайдеру.
— Дэймон

3
Полезный ответ - синтаксис здесь: <compilation ... batch = "false" />
— Катто,

1
Обратите внимание на это предупреждение: «Этот метод рекомендуется только для небольших приложений ... Это вызывает фрагментацию памяти».
— ThatMatthew

22

Это может произойти, если вы поместите файлы .cs в App_Code и измените их действие сборки на компиляцию в проекте веб-приложения.

Либо укажите действие сборки для файлов .cs в App_Code как Content, либо измените имя App_Code на другое. Я изменил имя, поскольку intellisense не исправляет файлы .cs, помеченные как содержимое.

Дополнительная информация на http://vishaljoshi.blogspot.se/2009/07/appcode-folder-doesnt-work-with-web.html


11

Одна из возможных причин этой ошибки заключается в том, что inherits=в <@page language=......inherits=>строке есть 2 страницы aspx с одинаковыми именами .

Изменение inherits=имени решает ошибку.


2
Это решило мою проблему, похоже, что копирование / вставка пользовательского элемента управления немного сложнее, когда вам не нужен код для чего-либо.
— Grubsnik

8

На всякий случай, если кто-то еще поделится моей проблемой, я получил эту ошибку при попытке опубликовать веб-сайт нового разветвленного проекта, сборка сработала отлично.

Оказывается, я забыл снять флажок «Разрешить обновлять предварительно скомпилированный сайт» в разделе « Параметры публикации» -> «Настроить предварительную компиляцию» .


4

В качестве еще одной точки данных у меня была эта проблема без каких-либо доказательств циклических ссылок, как описано в ссылках в ответе Бена. Создание моего проекта веб-сайта завершилось неудачей с некоторыми из этих ошибок, и настройка compilation batch="false"исправила их, но я не хотел идти по этому пути, поскольку это крупный производственный веб-сайт.

Это решение находилось в подпапке моей папки D: \ svn, которую я сопоставил с S :. Когда я открыл решение из S :, эти ошибки возникли, но если я сразу перейду к D: \ svn и открою решение, ошибок не будет.

Я также заметил, что, несмотря на наличие compilation batch="true"в моем файле web.config, при открытии решения с подключенного диска S: все мои файлы .ascx компилируются в свои собственные сборки. Если я открою его из физического местоположения, файлы .ascx будут скомпилированы в сборки соответствующих папок (именно так batch="true"и должно работать).

Странный.


4

Эта ошибка возникла из-за конфликта между именем класса веб-формы и заглушкой wsdl (код файла .cs), имеющей то же имя класса, т.е.

Страница ASPX: Dashboard Class: partiacl class Dashboard

AppCode / APIServices.cs: общедоступная панель управления частичным классом

Ошибка воспроизводилась только при публикации веб-сайта, но сборка и отладка не сообщали об ошибке.


2

В моем случае я переименовал проект, поэтому была переименована и dll. Когда я просто скопировал новую dll, но не подумал об удалении старой с сервера, у меня вскоре была куча пар классов с одинаковыми именами. Удаление устаревших dll помогло (разумеется).


2

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

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


2

В моем случае удаление всех выходных сборок из папок bin во всех проектах в решении решило проблему. К сожалению, у меня нет объяснения этому.


1

В моем случае проблема была решена, когда я отредактировал файл Designer.cs, у которого все еще было дублированное имя класса. по какой-то причине, когда я переименовал класс «logout» в «logout2», в файле конструктора он не был автоматически изменен и все еще оставался «logout», и это имя класса уже существовало в предварительно скомпилированной dll в моем проекте (которая принадлежит в стороннее веб-приложение, с которым я работаю и над которым работаю).


Если вы придумали новый способ вызвать сообщение об ошибке, не стесняйтесь добавлять его :)
— Бен Фултон

1

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

Переименовал класс проблемы и файл.

http://support.microsoft.com/kb/919284 Метод 2: Изменить порядок папок в приложении пишет о возможных циклических ссылках


1

Ни одно из этих решений не помогло мне. Обе мои конфликтующие библиотеки DLL находились в C: \ ... \ AppData \ ... \ Temporary ASP.NET Files \ ...

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

Я попытался удалить новую DLL - которой вообще не должно было быть в старой кодовой базе - из местоположения «Временные файлы ASP.NET», идентифицированного msbuild. msbuild просто положил обратно.

Я также попробовал параметр web.config, который некоторые здесь успешно использовали, но он тоже не сработал. Хотя, когда я пишу это, я понимаю, что на самом деле было два проекта MVC в одном решении, и в обоих были ошибки, поэтому проблема могла заключаться в том, что я не добавил настройку для обоих.

Я попытался перемотать репозиторий с исходным кодом вперед, очистить и снова откатиться и очистить. Ничего.

Я попытался удалить все, что находится в папке «Временные файлы ASP.NET». msbuild просто поставил обратно.

Наконец, я попробовал перестроить в Visual Studio. Хотя вывод командной строки и вывод «Ошибки» выдавали одну и ту же ошибку msbuild «Временные файлы ASP.NET», ошибка Intellisense - при наведении курсора на конфликтующий тип - фактически жаловалась на библиотеки DLL в выходных каталогах. Судя по всему, «Чистка» и «Реконструкция» не выполняли свою работу. Я вручную удалил библиотеки DLL в выходных каталогах, определенных Intellisense, и проблема была решена.

tl; dr - Убедитесь, что вы покрываете все свои web.configs с помощью пакетной настройки, и попробуйте использовать Intellisense для получения дополнительных подсказок.


1

Моя проблема была связана с .dll, которая создавалась в моей папке проекта.

Если вы ссылаетесь на другой файл, вместо того, чтобы делать все, что вы видите выше, мою проблему мгновенно решило просто удаление .dll, который оставался в моем каталоге / bin для моего проекта.

Проблема не обязательно в исправлении web.config - это циклическая ссылка, которую необходимо разрешить. Я понял, что очистил старую .dll в исходном файле проекта, но не в проекте, который на нее ссылался.

Я не рекомендую вносить изменения в ваш файл web.config, потому что это всего лишь временное исправление, а не решение реальной проблемы. Сделайте это, если вы не хотите устранять проблему, но если вы хотите избежать головной боли в будущем, просто удалите .dll из обоих мест.


1

У меня был частичный класс с тем же именем в двух разных проектах. Я решил это, оставив только в одном проекте.


0

Иногда может помочь удалить раствор и создать его снова. Поскольку такое использование происходит при преобразовании из VS2005 в vs2010, некоторые ссылки на framework 4.0 (после обновления) остаются в решении, даже все проекты определены как 3.5.

Обычно перестройка решения устраняет эти проблемы.


0

У меня была такая же проблема, когда я компилировал приложение на компилирующем сервере.

У моего контроллера был простой статический код, поэтому я изменил свой ascx:

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="controllerName.ascx.cs" Inherits="Controls.controllerName" %>

Чтобы

 <%@ Control Language="C#" AutoEventWireup="true" Src="controllerName.ascx.cs" Inherits="Controls.controllerName" %>

Также было удалено ключевое слово partial из внутреннего кода и добавлено пространство имен для внутреннего кода.

Это:

using System;
using System.Web.UI;

/// <summary>
/// My controller
/// </summary>
public partial class controllerName: UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

К этому:

using System;
using System.Web.UI;

namespace Controles
{
    /// <summary>
    /// My controller
    /// </summary>
    public class controllerName : UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
}

И это сработало для меня.


0

Для меня это произошло, когда мое местоположение PrecompiledWeb / Publish было установлено на текущий каталог, в котором также находилась корневая папка сайта.

Мой веб-сайт тогда видел папку публикации как часть проекта при компиляции / построении и затем таким образом находил дубликаты.

т.е. не помещайте опубликованную / предварительно скомпилированную версию вашего сайта в папки с кодом вашего сайта.



0

Размещение моего решения:

Проблема была связана с «сканированием при доступе» антивируса Mcafee. Отключение этого решило проблему. Каким-то образом временная папка ASP не использовалась должным образом ASP, когда антивирус был включен.

Надеюсь, это кому-то поможет.


Вы знаете почему? У моей команды тоже есть эта проблема, и они говорят, что это из-за McAfee, однако, исходя из корпоративных ИТ-правил, мы не можем деактивировать антивирус (который не должен мешать!).
— Кэт Лим Руис

Мы все еще ищем точную причину. К сожалению, исключение временной папки ASP из сканирования при доступе не решает проблему навсегда.
— Адриан Насуи


0

Перейдите в раздел «Добавить ссылку» и найдите обе библиотеки. Обе библиотеки должны были проверить, снимите флажок с одной из библиотек, поскольку создаются ссылки на одну и ту же библиотеку с неоднозначностью версии.


0

Мое решение заключалось в замене CodePage = "...." на CodeBehind = "..." в файле .aspx. Каким-то образом он остался как CodePage во время миграции с предыдущих версий .NET. Эта директива страницы создает другой файл DLL, который конфликтует с файлом DLL проекта.


0

Ни одно из этих решений не помогло мне. Компиляция в режиме «Release» работала, но когда я переключился на «Debug», я получил множество таких сообщений об ошибках.

Не понимаю почему, но моим решением был простой перезапуск Visual Studio .


0

Я столкнулся с проблемой во время компиляции.

Я согласен с атрибутами batch = "true" , ошибка сообщает, что существует 2 сборки

Решение 1: удаление одного из них

Решение 2. Настройте один из них.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.