Mieszanie C # i VB w tym samym projekcie


145

Czy można mieszać pliki VB i C # w tym samym projekcie dla biblioteki klas? Czy jest jakieś ustawienie, które to umożliwia?

Próbowałem i żaden z technologii intellisense pracuje całkiem dobrze, choć kompilator tło wydaje się obsługiwać go wystarczająco dobrze (pomijając fakt, że ja wtedy miał 2 klasy w tej samej przestrzeni nazw o tej samej nazwie, a nie narzekać).

Próbujemy przekonwertować z VB na C #, ale nie zakończyliśmy konwersji całego kodu. Mam nowy kod, który muszę napisać, ale tak naprawdę nie chciałem tworzyć nowego projektu tylko dla niego.


9
Dlaczego piszesz nowy kod w VB, jeśli właśnie zakończyłeś konwersję na C #?
Adam Robinson

Nawiasem mówiąc, pomyślałem, że możliwe jest uzyskanie podejścia hybrydowego przy użyciu klas częściowych w dwóch różnych projektach, ale części składowe nie mogą obejmować zestawów, więc to też nie zadziała.
D. Lambert

Cholera, to miała być moja następna próba.
Wes P

1
Naprawiono mój post. Nie skończyliśmy.
Wes P

10
jednym z powodów, dla których kod VB jest wmieszany, jest użycie jego unikalnych funkcji, w szczególności jego możliwości XML, jeśli na przykład używasz LINQ to XML. W ten sposób zamiast piśmie „od elementu root.Elements («Dane»)” można użyć składni XML dynamiczny VB: „Od elementem korzenia <Data>.”. Podczas dużej ilości pracy z plikami XML ta składnia może być znacznie łatwiejsza w użyciu niż w języku C #
Marchy

Odpowiedzi:


128

Nie, nie możesz. Zespół / projekt (zazwyczaj każdy projekt kompiluje się do 1 zestawu) musi być w jednym języku. Można jednak używać wielu zestawów, a każdy z nich może być kodowany w innym języku, ponieważ wszystkie są skompilowane do MSIL.

Skompilował się dobrze i nie narzekał, ponieważ projekt VB.NET faktycznie kompiluje tylko pliki .vb, a projekt C # faktycznie kompiluje tylko pliki .cs. Ignorował pozostałe, dlatego nie otrzymałeś błędów.

Edycja: Jeśli dodasz plik .vb do projektu C #, wybierz plik w panelu Eksplorator rozwiązań, a następnie spójrz na panel Właściwości, zauważysz, że Akcją kompilacji jest „Zawartość”, a nie „Kompiluj”. Jest traktowany jako prosty plik tekstowy i nie jest nawet osadzany w skompilowanym zestawie jako zasób binarny.

Edit: Z stronach asp.net można dodać c # kontrolą użytkownika na stronie internetowej vb.net


1
Istnieją sposoby na połączenie dwóch zestawów po fakcie, ale to nie rozwiązałoby problemu tego użytkownika.
Steven Sudit

To prawda, ale nie tolerowałbym tego wyłącznie w celu mieszania języków.
Joel B Fant

Uważam, że w tym samym projekcie można mieszać zarządzane i niezarządzane C ++.
Callum Rogers

@C Rogers: Ta sytuacja jest zupełnie inny stwór. Jeśli chcesz, możesz mieszać zarządzany i niezarządzany C ++ w tym samym pliku źródłowym. Ale to wciąż nie to samo, co mieszanie VB.NET i C #.
Joel B Fant

3
@DanHoward: Oj, pal. To zdecydowanie blokada, ponieważ nie można łączyć i dopasowywać języków w tym samym projekcie!

32

Cóż, właściwie odziedziczyłem projekt kilka lat temu od kolegi, który zdecydował się na połączenie formularzy internetowych VB i C # w tym samym projekcie. To działało, ale nie jest przyjemne w utrzymaniu.

Zdecydowałem, że nowy kod powinien być klasami C # i aby je uruchomić, musiałem dodać podwęzeł do części kompilacyjnej web.config

        <codeSubDirectories>
            <add directoryName="VB"/>
            <add directoryName="CS"/>
        </codeSubDirectories>

Cały kod VB trafia do podfolderu w App_Code o nazwie VB, a kod C # do podfolderu CS. Spowoduje to utworzenie dwóch plików .dll. Działa, ale kod jest kompilowany w tej samej kolejności, jak podano w „codeSubDirectories”, a zatem interfejsy powinny znajdować się w folderze VB, jeśli są używane zarówno w języku C #, jak i VB.

Mam zarówno odniesienie do VB, jak i kompilatora C # w programie

<system.codedom>
    <compilers>

Projekt jest obecnie aktualizowany do frameworka 3.5 i nadal działa (ale nadal nie jest przyjemny w utrzymaniu ...)


Więcej informacji można znaleźć na stackoverflow.com/questions/15711964/ ...
Jan

20

Nie możesz mieszać vb i c # w tym samym projekcie - jeśli zauważysz w Visual Studio, pliki projektu to .vbproj lub .csproj. Możesz w ramach rozwiązania - mieć 1 proj w VB i 1 w C #.

Wygląda na to, że zgodnie z tym możesz potencjalnie użyć ich obu w projekcie internetowym w katalogu App_Code:

http://pietschsoft.com/post/2006/03/30/ASPNET-20-Use-VBNET-and-C-within-the-App_Code-folder.aspx


3
Głosuj przeciw, ponieważ plik projektu nie jest powodem, dla którego nie możesz utworzyć zestawu z nich. Jeśli chcesz, możesz skompilować zestaw bez pliku projektu, który kiedykolwiek istniał, używając kompilatora z wiersza poleceń. Powodem, dla którego to nie zadziała, jest to, że zestaw jest (prawie zawsze) jednym zadaniem kompilacji z jednego kompilatora. Nie ma to nic wspólnego z plikiem projektu.
Tom W,

8
Głosuj za. Z punktu widzenia użytkowników pomysł, że rozszerzenie jest inne, jest charakterystycznym znakiem, że nie możesz /.
user4951

14

Może to być możliwe w przypadku niektórych niestandardowych rozwiązań MSBuild. Dostarczone .targets wymuszają, aby projekty były jednojęzyczne - ale nie ma ograniczeń dotyczących środowiska wykonawczego ani narzędzi, które to uniemożliwiają.

Kompilatory VB i CS mogą wysyłać do modułów - pliki .obj w wersji CLR. Używając konsolidatora zespołu, możesz pobrać moduły z kodu VB i CS i utworzyć pojedynczy zestaw.

Nie żeby był to trywialny wysiłek, ale prawdopodobnie zadziała.


6
Jest to dobry write-up na ten Thomas Freudenberg tutaj .
Dave M

1
Inny przykład można znaleźć w Sample: Mixing Unmanaged C ++, C ++ / CLI i C # code autorstwa Junfeng Zhang's. Może sprawić, że zacznie działać po pierwszym uruchomieniu. \ VC \ bin \ vcvars32.bat z mojej instalacji programu Visual Studio. To właściwie mieszanie różnych języków jest jednym zespołem, a nie jednym projektem.
R. Schreurs

7

Przewodnik: używanie wielu języków programowania w projekcie witryny sieci Web http://msdn.microsoft.com/en-us/library/ms366714.aspx

Domyślnie folder App_Code nie zezwala na wiele języków programowania. Jednak w projekcie witryny sieci Web można zmodyfikować strukturę folderów i ustawienia konfiguracji, aby obsługiwały wiele języków programowania, takich jak Visual Basic i C # . Dzięki temu ASP.NET może tworzyć wiele zestawów, po jednym dla każdego języka. Aby uzyskać więcej informacji, zobacz udostępnione foldery kodu w projektach sieci Web ASP.NET. Deweloperzy często uwzględniają wiele języków programowania w aplikacjach sieci Web, aby wspierać wiele zespołów programistycznych, które działają niezależnie i preferują różne języki programowania.


2

Chociaż Visual Studio tego nie obsługuje (możesz wykonać kilka sztuczek i uzyskać MSBuild, aby skompilować oba, ale nie z poziomu programu Visual Studio), SharpDevelop to robi. Możesz mieć oba w tym samym rozwiązaniu (o ile korzystasz z programu Visual Studio Professional i nowszych wersji), więc najłatwiejszym rozwiązaniem, jeśli chcesz nadal używać programu Visual Studio, jest oddzielenie kodu VB do innego projektu i dostęp do niego w ten sposób.


1
W jaki sposób ShartDevelop obsługuje to? Właśnie spróbowałem i nie kompiluje się. Czy jest coś specjalnego, co należy zrobić?
epitka

2

Kliknij prawym przyciskiem myszy projekt. Wybierz opcję Dodaj folder Asp.Net. W folderze utwórz dwa foldery, jeden o nazwie VBCodeFiles, a drugi o nazwie Inne pliki CSCode w sieci Web.Config dodaj nowy element do kompilacji

<compilation debug="true" targetFramework="4.5.1">
      <codeSubDirectories>
        <add directoryName="VBCodeFiles"/>
        <add directoryName="CSCodeFiles"/>
      </codeSubDirectories>
</compilation>

Teraz utwórz stronę cshtml. Dodaj odwołanie do VBCodeFiles.Namespace.MyClassName przy użyciu

@using DMH.VBCodeFiles.Utils.RCMHD
@model MyClassname

Gdzie MyClassName jest obiektem klasy znajdującym się w powyższej przestrzeni nazw. teraz zapisz obiekt w maszynce do golenia, używając pliku cshtml.

<p>@Model.FirstName</p>

Zwróć uwagę, że directoryName = "CSCodeFiles" jest nadmiarowa, jeśli jest to projekt C #, a directoryName = "VBCodeFiles" jest nadmiarowa, jeśli jest to projekt VB.Net.


2

Tak, to możliwe. Dodanie projektów C # i vb.net do jednego rozwiązania.

krok 1: Plik-> Dodaj-> Istniejący projekt

Krok 2: Projekt-> Dodaj odniesienie-> dll lub exe projektu, który dodałeś wcześniej.

step3: W formularzu vb.net, w którym chcesz użyć formularzy C #-> Importuj przestrzeń nazw projektu.


1

Nie rozumiem, jak można skompilować projekt za pomocą kompilatora C # (lub kompilatora VB) i nie przeszkadzać w niewłaściwym języku kompilatora.

Zachowaj kod C # w oddzielnym projekcie od projektu VB. Możesz uwzględnić te projekty w tym samym rozwiązaniu.


1

Potrzebujesz jednego projektu na język. Jestem pewien, że widziałem narzędzie, które łączyło zespoły, jeśli znajdziesz to narzędzie, powinieneś być dobry. Jeśli potrzebujesz używać obu języków w tej samej klasie, powinieneś być w stanie napisać połowę z nich w, powiedzmy, VB.net, a resztę napisać w C #, dziedzicząc klasę VB.net.


1

Ryzykując powtórzenie każdej innej odpowiedzi, nie, nie możesz ich łączyć w tym samym projekcie.

Pomijając to, jeśli właśnie zakończyłeś konwersję VB do C #, dlaczego miałbyś pisać nowy kod w VB?


2
Ponieważ znalazłeś błąd w moim poście :) Konwersja jeszcze się nie zakończyła.
Wes P

1

W przypadku .net 2.0 to działa. Kompiluje oba w tym samym projekcie, jeśli utworzysz podkatalogi w kodzie aplikacji z powiązanym kodem języka. Na razie jednak szukam, czy to powinno działać w 3.5, czy nie.


1

Dlaczego po prostu nie skompilujesz swojego VBkodu do biblioteki ( .dll), odnieś to później do swojego kodu i to wszystko. Zarządzany dllszawiera, MSILdo którego są kompilowane zarówno c#i vb.


2
Będziesz kompletnie wypchany, jeśli kiedykolwiek będziesz musiał odwołać się do dowolnego nowego kodu C # ze starszego kodu VB.NET. Lub odwrotnie, niezależnie od tego, którą drogą wybierzesz, są to tylko jednostronne odniesienia.
Roman Starkov

0

Jak powiedzieli inni, nie można umieścić obu w jednym projekcie. Jeśli jednak masz tylko mały fragment kodu C # lub VB, który chcesz dołączyć do projektu w innym języku, dostępne są narzędzia do automatycznej konwersji . Nie są idealne, ale większość rzeczy robią całkiem dobrze. Ponadto SharpDevelop ma wbudowane narzędzie do konwersji.


To jest to. Mógłbym to po prostu wciągnąć i zakodować to, czego potrzebuję, w VB i przekonwertować to później z resztą rzeczy.
Wes P

0

Nie, nie w tym samym projekcie, ale możesz ich użyć w tym samym rozwiązaniu. chociaż musisz uważać, aby Twój kod był zgodny z CLS. Oznacza to, że nie możesz używać takiej funkcji / funkcji, która nie jest zrozumiała w innym języku. Na przykład VB nie rozumie unsigned ints.


0

W naszym scenariuszu jest to pojedynczy projekt VB.NET (aplikacja Windows Desktop) w jednym rozwiązaniu. Chcieliśmy jednak skorzystać z funkcji języka C #, takich jak liczby całkowite ze znakiem / bez znaku oraz literały XML i funkcje ciągów w VB.NET. W zależności od funkcji, w czasie wykonywania kompilujemy plik kodu, kompilujemy go przy użyciu odpowiedniego kompilatora Rosalyn (VB / CS) do DLL i dynamicznie ładujemy do bieżącego zestawu. Oczywiście musieliśmy popracować nad usuwaniem linków, wyładowywaniem, ponownym ładowaniem, nazywaniem itp. Dynamicznych bibliotek DLL oraz zarządzaniem pamięcią, w przypadku gdy w większości używaliśmy dynamicznego identyfikatora GUID do nazewnictwa, aby uniknąć konfliktów. Działa dobrze, gdy użytkownik aplikacji może łączyć się z dowolną bazą danych z naszej aplikacji komputerowej, pisać zapytania SQL, konwertować połączenie na połączenie LINQ i pisać zapytania LINQ, co wszystko wymaga dynamicznego budowania kodu źródłowego, kompilowania do DLL i dołączania do bieżącego zestawu.


-1

Tak, oba te pliki można dodać tylko w serwisie WWW.Jeśli projekt jest aplikacją internetową, nie zezwoli na inny typ pliku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.