Mencampur C # & VB Dalam Proyek Yang Sama

145

Bisakah Anda mencampur file vb dan c # dalam proyek yang sama untuk perpustakaan kelas? Apakah ada pengaturan yang memungkinkan?

Saya mencoba dan tidak ada intellisense yang berfungsi dengan baik, meskipun kompiler latar belakang tampaknya menanganinya dengan cukup baik (selain dari kenyataan bahwa saya, kemudian, memiliki 2 kelas di namespace yang sama dengan nama yang sama dan tidak mengeluh).

Kami mencoba mengonversi dari VB ke C # tetapi belum selesai mengonversi semua kode. Saya memiliki beberapa kode baru yang perlu saya tulis, tetapi tidak benar-benar ingin membuat proyek baru hanya untuk itu.

Wes P
sumber
9
Mengapa Anda menulis kode baru dalam VB jika Anda baru saja selesai mengonversi ke C #?
Adam Robinson
Kebetulan, saya pikir mungkin untuk melakukan pendekatan hybrid menggunakan kelas parsial dalam dua proyek yang berbeda, tetapi parsial tidak dapat menjangkau majelis, jadi ini juga tidak akan berhasil.
D. Lambert
Dang, itu akan menjadi usaha saya berikutnya.
Wes P
1
Memperbaiki pos saya. Kami belum selesai.
Wes P
10
salah satu alasan untuk menggabungkan kode VB adalah untuk menggunakan fitur-fiturnya yang unik, terutama kemampuan XML-nya jika Anda menggunakan LINQ ke XML misalnya. Dengan begitu, alih-alih menulis 'dari elemen di root.Elements ("Data")' Anda bisa menggunakan sintaks XML dinamis VB: 'Dari elemen di root. <Data>'. Ketika bekerja banyak dengan file XML sintaks ini bisa lebih mudah untuk bekerja dengan daripada C #'s
Marchy

Jawaban:

129

Tidak bisa. Suatu perakitan / proyek (setiap proyek biasanya mengkompilasi ke 1 perakitan) harus satu bahasa. Namun, Anda dapat menggunakan banyak majelis, dan masing-masing dapat dikodekan dalam bahasa yang berbeda karena semuanya dikompilasi ke MSIL.

Ini dikompilasi dengan baik dan tidak mengeluh karena proyek VB.NET hanya akan benar-benar mengkompilasi file .vb dan proyek C # hanya akan benar-benar mengkompilasi file .cs. Itu mengabaikan yang lain, karena itu Anda tidak menerima kesalahan.

Sunting: Jika Anda menambahkan file .vb ke proyek C #, pilih file di panel Solution Explorer dan kemudian lihat panel Properties, Anda akan melihat bahwa Build Action adalah 'Konten', bukan 'Kompilasi'. Itu diperlakukan sebagai file teks sederhana dan bahkan tidak bisa tertanam dalam majelis yang dikompilasi sebagai sumber daya biner.

Sunting: Dengan situs web asp.net Anda dapat menambahkan kontrol pengguna web c # ke situs web vb.net

Joel B Fant
sumber
1
Ada beberapa cara untuk menggabungkan dua majelis setelah fakta, tetapi itu tidak akan menyelesaikan masalah pengguna ini.
Steven Sudit
Benar, tapi saya tidak akan memaafkannya hanya untuk tujuan campuran bahasa.
Joel B Fant
Saya percaya Anda dapat mencampur c ++ yang dikelola dan tidak dikelola dalam proyek yang sama.
Callum Rogers
@ C Rogers: Situasi itu adalah makhluk yang sepenuhnya berbeda. Anda dapat mencampur C ++ yang dikelola dan tidak dikelola dalam file sumber yang sama jika Anda mau. Tapi itu masih tidak sama dengan mencampur VB.NET dan C #.
Joel B Fant
4
@DanHoward: Aduh, bakar. Itu pasti sebuah blok di sana, tidak dapat mencampur dan mencocokkan bahasa dalam proyek yang sama!
32

Sebenarnya, saya mewarisi sebuah proyek beberapa tahun yang lalu dari seorang kolega yang telah memutuskan untuk mencampur VB dan C # webforms dalam proyek yang sama. Itu berhasil tetapi jauh dari menyenangkan untuk dipertahankan.

Saya memutuskan bahwa kode baru harus kelas C # dan untuk membuatnya bekerja saya harus menambahkan subnode ke bagian kompilasi dari web.config

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

Semua kode VB masuk ke subfolder di App_Code yang disebut VB dan kode C # ke dalam subfolder CS. Ini akan menghasilkan dua file .dll. Ini berfungsi, tetapi kode dikompilasi dalam urutan yang sama seperti yang tercantum dalam "codeSubDirectories" dan karenanya Antarmuka harus berada di folder VB jika digunakan dalam C # dan VB.

Saya memiliki kedua referensi ke VB dan C # compiler di

<system.codedom>
    <compilers>

Proyek ini saat ini diperbarui ke kerangka 3.5 dan masih berfungsi (tetapi masih tidak menyenangkan untuk dipelihara ..)

Lars Aneh
sumber
Lihat stackoverflow.com/questions/15711964/… untuk lebih jelasnya
John
20

Anda tidak dapat mencampur vb dan c # dalam proyek yang sama - jika Anda perhatikan di studio visual file proyek adalah .vbproj atau .csproj. Anda dapat menggunakan solusi - miliki 1 proj dalam vb dan 1 dalam c #.

Sepertinya menurut ini, Anda berpotensi menggunakannya keduanya dalam proyek web di direktori App_Code:

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

brendan
sumber
3
Downvote karena file Proyek bukan alasan Anda tidak dapat menghasilkan perakitan dari mereka. Anda dapat mengkompilasi rakitan tanpa file proyek yang pernah ada jika Anda mau, menggunakan kompiler dari baris perintah. Alasan mengapa hal itu tidak berhasil adalah bahwa sebuah assembly (hampir selalu) merupakan satu pekerjaan kompilasi dari satu compiler. Tidak ada hubungannya dengan file proyek.
Tom W
8
Suara positif. Dari sudut pandang pengguna, gagasan bahwa ekstensi itu berbeda adalah tanda bahwa Anda tidak bisa /.
user4951
14

Mungkin dengan beberapa pengembangan MSBuild kustom. .Target yang disediakan memaksa proyek menjadi bahasa tunggal - tetapi tidak ada batasan runtime atau tooling yang mencegah hal ini.

Baik kompiler VB dan CS dapat menampilkan ke modul - versi CLR untuk file .obj. Dengan menggunakan tautan rakitan, Anda dapat mengambil modul dari kode VB dan CS dan menghasilkan satu rakitan.

Bukan berarti ini akan menjadi upaya sepele, tetapi mungkin akan berhasil.

Scott Weinstein
sumber
6
Ada tulisan bagus tentang hal ini oleh Thomas Freudenberg di sini .
Dave M
1
Contoh lain dari dapat ditemukan dalam Contoh: Mencampur kode C ++, C ++ / CLI, dan C # yang tidak dikelola oleh Junfeng Zhang's. Itu bisa membuatnya bekerja setelah pertama kali dijalankan. \ VC \ bin \ vcvars32.bat dari instalasi Visual Studio saya. Ini sebenarnya pencampuran bahasa yang berbeda adalah satu majelis daripada dalam satu proyek.
R. Schreurs
7

Panduan: Menggunakan Beberapa Bahasa Pemrograman dalam Proyek Situs Web http://msdn.microsoft.com/en-us/library/ms366714.aspx

Secara default, folder App_Code tidak memungkinkan banyak bahasa pemrograman. Namun, dalam proyek situs Web Anda dapat memodifikasi struktur folder dan pengaturan konfigurasi untuk mendukung berbagai bahasa pemrograman seperti Visual Basic dan C # . Ini memungkinkan ASP.NET untuk membuat banyak majelis, satu untuk setiap bahasa. Untuk informasi lebih lanjut, lihat Folder Kode Bersama di Proyek Web ASP.NET. Pengembang biasanya menyertakan beberapa bahasa pemrograman dalam aplikasi Web untuk mendukung beberapa tim pengembangan yang beroperasi secara independen dan lebih memilih bahasa pemrograman yang berbeda.

gerryLowry
sumber
2

Meskipun Visual Studio tidak mendukung ini (Anda dapat melakukan beberapa trik dan membuat MSBuild mengkompilasi keduanya, tetapi tidak dari dalam Visual Studio), SharpDevelop melakukannya. Anda dapat memiliki keduanya dalam solusi yang sama (selama Anda menjalankan Visual Studio Professional ke atas), jadi solusi termudah jika Anda ingin tetap menggunakan Visual Studio adalah dengan memisahkan kode VB Anda ke dalam proyek yang berbeda dan mengaksesnya dengan cara itu.

Kris Erickson
sumber
1
Bagaimana ShartDevelop mendukung ini? Saya baru saja mencobanya dan tidak bisa dikompilasi. Adakah hal khusus yang perlu dilakukan?
epitka
2

Klik kanan Proyek. Pilih Tambahkan Folder Asp.Net. Di bawah Folder, buat dua folder, satu bernama VBCodeFiles dan CSCodeFiles lainnya di Web.Config menambahkan elemen baru di bawah kompilasi

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

Sekarang, Buat halaman cshtml. Tambahkan referensi ke VBCodeFiles.Namespace.MyClassName menggunakan

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

Di mana MyClassName adalah objek kelas yang ditemukan di namespace di atas. sekarang tulis objek dalam pisau cukur menggunakan file cshtml.

<p>@Model.FirstName</p>

Harap dicatat, direktoriName = "CSCodeFiles" berlebihan jika ini adalah Proyek C # dan direktoriName = "VBCodeFiles" berlebihan jika ini adalah proyek VB.Net.

RickIsWright
sumber
2

Ya itu mungkin. Menambahkan c # dan vb.net memproyeksikan menjadi solusi tunggal

langkah1: File-> Tambah-> Proyek Yang Ada

Langkah2: Proyek-> Tambahkan referensi-> dll atau exe proyek yang Anda tambahkan sebelumnya.

step3: Dalam formulir vb.net di mana Anda ingin menggunakan c # forms-> import namespace of project.

pengguna6808128
sumber
1

Saya tidak melihat bagaimana Anda dapat mengkompilasi proyek dengan kompiler C # (atau kompiler VB) dan tidak menolak di bahasa yang salah untuk kompiler.

Simpan kode C # Anda di proyek terpisah dari proyek VB Anda. Anda dapat memasukkan proyek-proyek ini ke dalam solusi yang sama.

kendali
sumber
1

Anda memerlukan satu proyek per bahasa. Saya cukup yakin saya melihat alat yang menggabungkan rakitan, jika Anda menemukan alat itu Anda harus baik untuk pergi. Jika Anda perlu menggunakan kedua bahasa di kelas yang sama, Anda harus dapat menulis setengahnya di katakanlah VB.net dan kemudian menulis sisanya dalam C # dengan mewarisi kelas VB.net.

svinto
sumber
1

Dengan risiko mengulangi setiap jawaban lain, tidak, Anda tidak dapat mencampurkannya dalam proyek yang sama.

Selain itu, jika Anda baru saja selesai mengonversi VB ke C #, mengapa Anda menulis kode baru di VB?

Adam Robinson
sumber
2
Karena Anda menemukan kesalahan dalam posting saya :) Kami belum selesai mengonversi.
Wes P
1

Untuk .net 2.0 ini berfungsi. Itu TIDAK mengkompilasi keduanya dalam proyek yang sama jika Anda membuat sub direktori dalam kode aplikasi dengan kode bahasa terkait. Sampai sekarang, saya mencari apakah ini harus bekerja dalam 3,5 atau tidak.

mgbeers
sumber
1

Mengapa Anda tidak mengkompilasi VBkode Anda ke perpustakaan ( .dll). Referensi nanti dari kode Anda dan hanya itu. Dikelola dllsmengandung MSILyang keduanya c#dan vbdikompilasi.

Ajov
sumber
2
Anda akan sepenuhnya diisi jika Anda perlu referensi kode C # baru Anda dari kode VB.NET lama. Atau sebaliknya, ke mana pun Anda pergi, itu hanya referensi satu arah.
Roman Starkov
0

Seperti yang orang lain katakan, Anda tidak dapat menempatkan keduanya dalam satu proyek. Namun, jika Anda hanya memiliki sepotong kecil kode C # atau VB yang ingin Anda sertakan dalam proyek dalam bahasa lain, ada alat konversi otomatis . Mereka tidak sempurna, tetapi mereka melakukan banyak hal dengan cukup baik. Selain itu, SharpDevelop memiliki utilitas konversi bawaan.

Scott Whitlock
sumber
Itu dia. Saya hanya bisa menyedotnya dan mengkode apa yang saya butuhkan di VB dan mengubahnya nanti dengan sisanya.
Wes P
0

Tidak, tidak dalam proyek yang sama. Tetapi Anda dapat menggunakannya dalam solusi yang sama. meskipun Anda perlu berhati-hati bahwa kode Anda sesuai dengan CLS. Itu berarti Anda tidak boleh menggunakan fungsionalitas / fitur tersebut yang tidak dimengerti oleh bahasa lain. Misalnya VB tidak mengerti int unsigned.

juhi
sumber
0

Dalam skenario kami, ini adalah proyek VB.NET tunggal (aplikasi Windows Desktop) dalam satu solusi. Namun kami ingin memanfaatkan fitur C # seperti bilangan bulat yang ditandatangani / tidak ditandatangani dan fitur literal XML dan string di VB.NET. Jadi tergantung pada fitur, pada saat runtime kita membangun file kode, kompilasi menggunakan masing-masing Rosalyn compiler (VB / CS) ke dalam DLL dan secara dinamis memuat ke perakitan saat ini. Tentu saja kami harus mengerjakan delinking, unloading, reload, penamaan dll DLL dinamis dan manajemen memori yang kami gunakan GUID dinamis untuk penamaan untuk menghindari konflik. Ini berfungsi dengan baik di mana pengguna aplikasi dapat terhubung ke DB apa pun dari aplikasi desktop kami, menulis kueri SQL, mengonversi koneksi ke koneksi LINQ dan menulis kueri LINQ juga yang semuanya membutuhkan pembangunan dinamis kode sumber, mengkompilasi ke dalam DLL dan melampirkan ke perakitan saat ini.

Venkat
sumber
-1

Ya, Anda dapat menambahkan kedua file di situs web saja. Jika proyek ini adalah aplikasi web, itu tidak akan memungkinkan berbagai jenis file.

Python
sumber