2011-07-28 5 views
5

Nie jestem szczególnie utalentowanym programistą w świecie Windows i mam problem, który wymaga wyjaśnienia. Mam nadzieję, że w mojej niewiedzy brakuje mi czegoś oczywistego.Błąd kompilacji programu .NET Visual Studio "występuje inna deklaracja częściowa tego typu"

Znalazłem się zmuszonym do odwrotnej kompilacji prekompilowanej witryny/aplikacji .NET. Odbicie udało się mi C# CodeFile Mówię potrzebne, i spędziłem sporo czasu zmienia się cały aspx referencje od rzeczy tak:

<%@ page language="C#" autoeventwireup="true" inherits="someclassname, App_Web_Z8sdf" %> 

do rzeczy tak:

<%@ page language="C#" autoeventwireup="true" CodeFile="somefilename.aspx.cs" inherits="someclassname" %> 

i przenoszenie plików aspx.cs do tego samego katalogu, co pliki .aspx.

Doprowadziło mnie to do punktu, w którym mógłbym załadować projekt w nieco edytowalnej formie w Visual Studio. Próbowałem tego zarówno w latach 2010 i 2008.

Teraz jednak staram się zbudować ten projekt. Otrzymuję błąd:

"Missing partial modifier on declaration of type 'someclassname'; another partial declaration of this type exists" 

Odpowiednio. Rozumiem, że klasy można zadeklarować w wielu miejscach, a każde z nich musi mieć słowo kluczowe "częściowe", aby mogło działać. Więc dodam częściowe słowo kluczowe do definicji klasy w aspx.cs złożyć, że błąd ma miejsce. To udało się pozbyć się tego komunikatu o błędzie, i zastąpienie go

"The type 'someclassname' already contains a definition for 'some variable name". 

To wyraźnie zachowuje się jak nie ma innego gdzieś jest definicja klasy. Będąc głównie administratorem unix, zaczynam przeszukiwać wszystkie pliki w projekcie pod kątem ciągów pasujących do nazwy danej klasy, a znajduję ją dokładnie w dwóch plikach i tylko dwóch. Plik aspx zawierający pierwsze wiersze, które zacytowałem, oraz plik aspx.cs, który odpowiada temu, który zawiera definicję klasy. Teraz się mylę.

Przeczytałem kilka postów na forach wskazujących, że Visual Studio utworzy pliki "projektantów" z częściowymi klasami, co wydaje się obiecujące, ale nie widzę tych plików projektanta, nawet gdy przeglądam wszystkie pliki w VS, kiedy Patrzę na katalog na dysku lub naprawdę nigdzie indziej. Najwyraźniej czegoś brakuje. Być może nie wykonałem poprawnie rekonstytucji ze wstępnie skompilowanej strony? Może jest jakieś ustawienie w web.config lub innym pliku, który muszę zmienić?

Każda pomoc zostanie bardzo doceniona.

Na życzenie uogólniona wersja definicji SomeClass

using System; 
    using System.Web; 
    using System.Web.Profile; 
    using System.Web.SessionState; 
    using System.Web.UI; 
    using System.Web.UI.HtmlControls; 
    using System.Web.UI.WebControls; 

    public class Some_Class_Name : Page, IRequiresSessionState 
    { 
     /// a bunch of variables defined like this 
     protected HtmlForm form1; 

     ///a bunch of protected methods defined similarly to this 

     protected void LinkButtonReturn_Click(object sender, EventArgs e) 
     { 
      this.Session.Clear(); 
      base.Response.Redirect("Default.aspx"); 
     } 

} 

aktualizacji To wydaje się być wynikiem konwersji z prekompilowany miejscu z powrotem do źródła. Pliki .aspx.cs zawierają definicje pól kontrolnych (jeśli jest to poprawna terminologia, którą nazwałbym naiwnie "definicjami zmiennych"), której nie powinny, i brak częściowej deklaracji, że powinny one mieć. Spekulując dziko, wydaje się, że definicje są faktycznie implikowane przez plik aspx, a więc plik aspx.cs ich nie potrzebuje. Wielkie dzięki dla Dana Abramova i wszystkich innych, którzy komentowali.

+0

Czy możesz opublikować definicję "someclass"? – scottm

+0

Mogę opublikować uogólnioną wersję. – malcolmpdx

+0

Nie jestem facetem WebForms, ale czy możesz spróbować kompilacji po usunięciu wszystkich pól kontrolnych (takich jak 'form1')? Może jednak jestem okropnie zły. –

Odpowiedz

2

Mogę być strasznie nie na miejscu, ale podejrzewam, że kompilator generuje częściowe klasy oparte na samym kodzie aspx. Jeśli to prawda, takie klasy oczywiście zawierają pola takie jak form1.

Usunąłbym wszystkie deklaracje pola kontrolnego i zobaczę, czy to pomaga. Zauważ, że nie jestem facetem WebForms, więc jest to domysły.

+0

Wiesz, mogłeś go przybić. Porównywanie wersji I rekonstytuowanej z Reflectionem na znacznie starszą wersję tego samego kodu, a pliki aspx.cs nie zawierają żadnej z definicji pól kontrolnych. Usunięcie ich, ale pozostawienie częściowego słowa kluczowego w miejscu (które również istnieje w starszej wersji kodu) wygląda na to, że rozwiązuje wszelkie konflikty. Dzięki! Zdecydowanie powiem, że to odpowiadało przynajmniej na tę część problemu. – malcolmpdx

4

To pytanie jest trochę stare, ale właśnie napotkałem podobny problem podczas dekompilowania kodu .NET za pomocą Reflectora.

Powodem, dla którego powstają te błędy, jest dyrektywa "CodeFile = ..." na stronie ASPX. Kiedy ASP.NET widzi dyrektywę CodeFile, automatycznie generuje plik projektanta (tj. Częściową klasę z definicjami kontroli). Zmiana dyrektywy CodeFile na dyrektywę CodeBehind rozwiązała wszystkie moje problemy.

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

+0

+1 Usunąłem plik .designer, który rozwiązał problem. Po prostu dwa miejsca, w których zadeklarowano nazwę klasy. –

0

Podobny, ale nie do końca podobny problem przydarzył mi się dzisiaj podczas implementowania kodu usługi Web Service przy użyciu WCF. Podczas tworzenia kodu pośredniczącego i serwera proxy służącego do projektowania prototypowania nieumyślnie umieszczam automatycznie wygenerowany kod w tej samej przestrzeni nazw co kod definicji usługi.

Moim rozwiązaniem było przeniesienie automatycznie wygenerowanego klienta proxy do jego własnej przestrzeni nazw i wszystko było w porządku.

Powiązane problemy