Błąd ASP.Net: „Typ„ foo ”istnieje zarówno w plikach„ temp1.dll ”, jak i„ temp2.dll ”

108

Podczas uruchamiania projektu aplikacji internetowej w pozornie przypadkowych momentach strona może się nie powieść z błędem CS0433: typ istnieje w wielu bibliotekach DLL. Wszystkie biblioteki DLL są generowanymi plikami DLL znajdującymi się w katalogu „Temporary ASP.NET Files”.

Ben Fulton
źródło

Odpowiedzi:

135

Dodaj atrybut batch = "false" do elementu "compilation" w pliku web.config.

Ten problem występuje z powodu sposobu, w jaki ASP.NET 2.0 używa odwołań do aplikacji i struktury folderów aplikacji do kompilowania aplikacji. Jeśli właściwość wsadowa elementu w pliku web.config aplikacji jest ustawiona na wartość true, ASP.NET 2.0 kompiluje każdy folder w aplikacji do osobnego zestawu.

http://www.sellsbrothers.com/1995

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

Ben Fulton
źródło
Człowieku, dzięki za to. Starałem się dziś to naprawić w zakładzie produkcyjnym. Nie wiem, co to spowodowało (działało dobrze przez tak długi czas!), Ale to rozwiązało problem.
Matt
dzięki. To działa. Obudziłem się dziś rano z tym błędem. MÓJ ISP Discountasp.net musiał coś zmienić. Gdyby nie ten post, nadal miałbym błąd. Kciuki w dół za mojego ISP.
Damon
3
Pomocna odpowiedź - składnia jest tutaj: <compilation ... batch = "false" />
Catto
1
Zwróć uwagę na to ostrzeżenie: „Ta metoda jest zalecana tylko w przypadku małych aplikacji ... Powoduje to fragmentację pamięci”.
ThatMatthew
22

Może się tak zdarzyć, jeśli umieścisz pliki .cs w App_Code i zmienisz ich akcję kompilacji na kompilację w projekcie aplikacji sieci Web.

Ustaw akcję kompilacji dla plików .cs w App_Code jako zawartość lub zmień nazwę App_Code na coś innego. Zmieniłem nazwę, ponieważ Intellisense nie naprawi plików .cs oznaczonych jako zawartość.

Więcej informacji na http://vishaljoshi.blogspot.se/2009/07/appcode-folder-doesnt-work-with-web.html

Lilja
źródło
11

Jedną z możliwych przyczyn tego błędu jest to, że inherits=w <@page language=......inherits=>wierszu znajdują się 2 strony aspx, które mają tę samą nazwę .

Zmiana inherits=nazwy rozwiązuje błąd.

Amrinder Singh
źródło
2
To rozwiązało mój problem, wydaje się, że kopiowanie / wklejanie kontrolki użytkownika jest trochę trudne, gdy nie potrzebujesz kodu za kodem, aby cokolwiek robić.
Grubsnik
8

Na wypadek, gdyby ktoś inny podzielił mój problem, otrzymałem ten błąd, gdy próbowałem opublikować witrynę sieci Web nowo rozgałęzionego projektu, kompilacja działała idealnie.

Okazuje się, że zapomniałem usunąć pole wyboru „Zezwól na aktualizację prekompilowanej witryny” w Ustawieniach publikowania -> Konfiguruj prekompilację .

ErikDaBe
źródło
4

Jako kolejny punkt danych, po prostu miałem ten problem bez żadnych dowodów cyklicznych odniesień, jak opisano w linkach w odpowiedzi Bena. Zbudowanie projektu witryny sieci Web zakończy się niepowodzeniem z powodu kilku z tych błędów i ustawieńcompilation batch="false" go naprawiło, ale nie chciałem iść tą drogą, ponieważ jest to duża witryna produkcyjna.

To rozwiązanie znajdowało się w podfolderze mojego folderu D: \ svn, który zamapowałem na S :. Kiedy otworzyłem rozwiązanie z S :, te błędy wystąpiły, ale jeśli poszedłem prosto do D: \ svn i otworzyłem rozwiązanie, żadnych błędów.

Zauważyłem również, że pomimo posiadania compilation batch="true"w moim web.config, podczas otwierania rozwiązania z zmapowanego S: drive wszystkie moje pliki .ascx są kompilowane do własnych zestawów. Jeśli otworzę go z fizycznej lokalizacji, pliki .ascx zostaną skompilowane do odpowiednich zestawów folderów (i tak batch="true"powinno działać).

Dziwne.

Mike Powell
źródło
4

Ten błąd był spowodowany konfliktem między nazwą klasy formularza internetowego a kodem wsdl (kod związany z plikiem .cs) o tej samej nazwie klasy, tj.

Strona ASPX: Dashboard Class: partiacl class Dashboard

AppCode / APIServices.cs: publiczny panel klasy częściowej

Błąd można było odtworzyć tylko po opublikowaniu strony internetowej, ale kompilacja i debugowanie nie spowodowały żadnego błędu.

Ravi Garg
źródło
2

W moim przypadku zmieniłem nazwę projektu, więc również dll została zmieniona. Kiedy właśnie skopiowałem nową bibliotekę dll, ale nie pomyślałem o usunięciu starej z serwera, wkrótce miałem kilka par klas o tych samych nazwach. Usunięcie przestarzałych bibliotek dll działało (z przyczyny).

simaglei
źródło
2

Żadna z tych odpowiedzi nie działała dla mnie, jednak udało mi się rozwiązać problem. Ponieważ korzystałem z funkcji publikowania VS do wdrażania aplikacji internetowej, wybrałem opcję usunięcia wszystkich istniejących plików przed opublikowaniem w kreatorze publikowania w sieci Web. To wymusiło czystą kopię aplikacji i wszystko działało dobrze.

To rozwiązanie może być pomocne, jeśli lokalna kopia debugowania działa dobrze, ale opublikowany system nie. Świetnie również, jeśli nie chcesz poświęcać czasu na wyśledzenie poszczególnych bibliotek dll do usunięcia i nie przeszkadza Ci to, że pliki produkcyjne są najpierw usuwane.

kad81
źródło
2

W moim przypadku usunięcie wszystkich zestawów wyjściowych z folderów bin we wszystkich projektach w rozwiązaniu rozwiązało problem. Niestety nie mam na to żadnego wytłumaczenia.

dannydk
źródło
1

W moim przypadku problem został rozwiązany, kiedy edytowałem plik Designer.cs, który nadal miał zduplikowaną nazwę klasy. z jakiegoś powodu, kiedy zmieniłem nazwę klasy „logout” na „logout2”, w pliku projektanta nie została ona automatycznie zmieniona i nadal była „wylogowana”, a ta nazwa klasy już istniała w prekompilowanej bibliotece dll w moim projekcie (to należy do aplikacji internetowej innej firmy, z którą pracuję i wokół której rozwijam).

user960123
źródło
Jeśli wymyślisz nowy sposób wywołania komunikatu o błędzie, możesz go dodać :)
Ben Fulton
1

Masz ten problem, gdy umieścisz część strony aspx w oddzielnej kontrolce użytkownika. Na moim komputerze wszystko było w porządku, na serwerze pojawił się błąd.

Zmieniono nazwę klasy i pliku problemu.

http://support.microsoft.com/kb/919284 Metoda 2: Zmień kolejność folderów w aplikacji zawiera opis możliwych odwołań cyklicznych

Anastasia Melnikova
źródło
1

Żadne z tych rozwiązań nie działało dla mnie. Obie moje konflikty DLL znajdowały się w C: \ ... \ AppData \ ... \ Temporary ASP.NET Files \ ...

Problem polegał na tym, że przywróciłem moje repozytorium źródłowe do wcześniejszej wersji - zanim przenieśliśmy typ z jednego projektu do innego projektu w ramach tego samego rozwiązania.

Próbowałem usunąć nowszą bibliotekę DLL - której w ogóle nie powinno być w starszej bazie kodu - z lokalizacji „Temporary ASP.NET Files” zidentyfikowanej przez msbuild. msbuild po prostu go odłożył.

Wypróbowałem również ustawienie web.config, którego niektórzy tutaj używali z powodzeniem, ale to też nie działa. Chociaż, pisząc to, zdaję sobie sprawę, że faktycznie były dwa projekty MVC w ramach tego samego rozwiązania i oba zawierały błędy, więc problem mógł polegać na tym, że nie dodałem ustawienia do obu.

Próbowałem przetoczyć repozytorium źródła do przodu, wyczyścić i ponownie przetoczyć i wyczyścić. Nic.

Próbowałem usunąć wszystko z lokalizacji „Temporary ASP.NET Files”. msbuild po prostu włóż go ponownie.

Wreszcie spróbowałem przebudować w Visual Studio. Chociaż dane wyjściowe wiersza polecenia i dane wyjściowe „Błędy” wskazywały ten sam błąd programu MSBuild „Tymczasowe pliki ASP.NET”, błąd Intellisense - podczas najeżdżania kursorem myszy na typ będący w konflikcie - w rzeczywistości zgłaszał problem dotyczący bibliotek DLL w katalogach wyjściowych. Najwyraźniej „Clean” i „Rebuild” nie wykonywały swojej pracy. Ręcznie usunąłem biblioteki DLL w katalogach wyjściowych zidentyfikowanych przez Intellisense i problem został rozwiązany.

tl; dr - Upewnij się, że wszystkie pliki web.config są objęte ustawieniem wsadowym i spróbuj wykorzystać Intellisense w celu uzyskania dalszych wskazówek.

Andrew Kvochick
źródło
1

Mój problem był powiązany z plikiem .dll, który był generowany w folderze mojego projektu.

Jeśli odwołujesz się do innego pliku, zamiast robić wszystko, co widzisz powyżej, tym, co natychmiast rozwiązało mój problem, było po prostu usunięcie pliku .dll, który znajdował się w moim katalogu / bin dla mojego projektu.

Problem niekoniecznie jest związany z poprawką w pliku web.config - jest to odwołanie cykliczne, które należy rozwiązać. Zdałem sobie sprawę, że wyczyściłem stary plik .dll w moim oryginalnym pliku projektu, ale nie w projekcie, do którego się odwoływał.

Nie polecam dokonywania modyfikacji w pliku web.config, ponieważ jest to tylko naprawa zespołu, która nie rozwiązuje rzeczywistego problemu. Zrób to, jeśli nie masz ochoty naprawiać problemu, ale jeśli chcesz uniknąć przyszłych bólów głowy, po prostu usuń plik .dll z obu miejsc.

cr1pto
źródło
1

Miałem zajęcia częściowe o tej samej nazwie w dwóch różnych projektach. Rozwiązałem to, zostawiając go tylko w jednym projekcie.

Cosmin
źródło
0

Czasami może pomóc usunięcie rozwiązania i utworzenie go ponownie. Ponieważ takie użycie ma miejsce po konwersji z VS2005 na vs2010, niektóre odniesienia do frameworka 4.0 (po aktualizacji) pozostają w rozwiązaniu, nawet wszystkie projekty są zdefiniowane jako 3.5.

Zwykle odbudowanie rozwiązania powinno rozwiązać te problemy.

Roel AK Mohunlol
źródło
0

Miałem ten sam problem, kiedy kompilowałem aplikację na serwerze kompilującym.

Mój kontroler miał prosty kod statyczny, więc zmieniłem mój ascx:

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

Do

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

Usunięto również częściowe słowo kluczowe z elementu codebehind i dodano przestrzeń nazw do elementu codebehind.

To:

using System;
using System.Web.UI;

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

Do tego:

using System;
using System.Web.UI;

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

I to zadziałało dla mnie.

Saliba
źródło
0

U mnie stało się tak, gdy moja lokalizacja PrecompiledWeb / Publish była ustawiona na bieżący katalog, w którym znajdował się również folder główny witryny.

Moja witryna sieci Web widziała wtedy folder publikowania jako część projektu podczas kompilowania / budowania, a następnie znajdowała duplikaty w ten sposób.

tj. Nie umieszczaj opublikowanej / wstępnie skompilowanej wersji witryny w folderach z kodem witryny.

David d C e Freitas
źródło
0

Jeśli biblioteki DLL są wyświetlane w folderze tymczasowym, spróbuj wyczyścić rozwiązanie.

Hugo Nava Kopp
źródło
0

Publikowanie mojego rozwiązania:

Problem był związany ze „Skanowaniem na bieżąco” programu Mcafee Antivirus. Wyłączenie tego rozwiązało problem. W jakiś sposób folder tymczasowy ASP nie był prawidłowo używany przez ASP, gdy program antywirusowy był włączony.

Mam nadzieję, że to komuś pomoże.

Adrian Nasui
źródło
Czy wiesz, dlaczego? Mój zespół też ma ten problem i mówią, że to z powodu McAfee, jednak w oparciu o korporacyjne reguły IT nie możemy dezaktywować antywirusa (co nie powinno przeszkadzać!).
Kat Lim Ruiz,
Nadal pracujemy nad znalezieniem dokładnej przyczyny. Niestety wykluczenie folderu tymczasowego ASP ze skanowania podczas uzyskiwania dostępu nie zawsze rozwiązuje problem.
Adrian Nasui,
0

Idź do Dodaj odniesienie i wyszukaj obie biblioteki dll, obie biblioteki dll byłyby zaznaczone, odznacz jedną z bibliotek dll, ponieważ są generowane odwołania do tej samej biblioteki dll z różną niejednoznacznością wersji.

RkHirpara
źródło
0

Moim rozwiązaniem było zastąpienie CodePage = "...." kodem CodeBehind = "..." w pliku .aspx. W jakiś sposób pozostał jako CodePage podczas migracji z poprzednich wersji .NET. Ta dyrektywa strony tworzy inny plik dll, który powoduje konflikt z plikiem dll projektu.

mtkale
źródło
0

Żadne z tych rozwiązań nie zadziałało. Kompilacja w trybie „Release” działała, ale kiedy przełączyłem się na „Debug”, otrzymałem wiele komunikatów o błędach.

Nie rozumiem dlaczego, ale moim rozwiązaniem było proste ponowne uruchomienie programu Visual Studio .

Beetee
źródło
0

Miałem problem w czasie kompilacji.

I zgadzam się z partii = „true” atrybuty, błąd mówi istnieją 2 Montaż

Rozwiązanie 1: usunięcie jednego z nich

Rozwiązanie 2: Skonfiguruj jeden z nich

Hamit YILDIRIM
źródło