Aynı Projede C # ve VB'yi Karıştırma


150

Bir sınıf kitaplığı için aynı projede vb ve c # dosyalarını karıştırabilir misiniz? Bunu mümkün kılan bir ayar var mı?

Arka plan derleyicisi yeterince iyi işliyor gibi görünse de (aynı isim alanında aynı isimde 2 sınıfım olduğu ve şikayet etmediği gerçeğinin yanı sıra), denedim ve hiçbiri doğru çalışmıyor.

Biz C # VB dönüştürmek için çalışıyoruz ama henüz tüm kodu dönüştürme tamamladı. Yazmam gereken yeni bir kodum var ama sadece bunun için yeni bir proje yapmak istemedim.


9
C #'a dönüştürmeyi yeni bitirdiyseniz neden VB'de yeni kod yazıyorsunuz?
Adam Robinson

Bu arada, iki farklı projede kısmi sınıfları kullanarak hibrit bir yaklaşım çekmenin mümkün olabileceğini düşündüm, ancak kısmi parçalar derlemeleri kapsayamaz, bu yüzden bu da işe yaramaz.
D. Lambert

10
VB kodunun karıştırılmasının nedenlerinden biri, örneğin LINQ to XML kullanıyorsanız, benzersiz özelliklerini, özellikle XML yeteneklerini kullanmaktır. Böylelikle 'kökten eleman ("Veri")' yazmak yerine, VB'nin dinamik XML sözdizimini kullanabilirsiniz: 'Kökten eleman. <Veri>'. XML dosyalarıyla çok fazla çalışırken, bu sözdizimi ile çalışmak C # '
lardan

Tartışmanızı gördüm ve az önce bir test yaptım: vb.net'te yazılmış tüm sayfaların bulunduğu bir web sitem var, kodu app_code'da .. vb. C # kodlu yeni bir sayfa ekledim, page_load'da şeyler yapıyorum ve çalışıyor! hata yok hiçbir şey yok.
Edd

@Edd ilginç deney. Bu soruda tartışılan durumdan farklı bir durum, dağıtım için bir sınıf kitaplığı (.dll) oluşturmaktır. Ama yine de çok ilginç.
ToolmakerSteve

Yanıtlar:


130

Hayır, yapamazsınız. Bir derleme / proje (her proje genellikle 1 derlemeye derlenir) bir dil olmalıdır. Ancak, birden çok derleme kullanabilirsiniz ve her biri farklı bir dilde kodlanabilir çünkü hepsi CIL'de derlenmiştir.

İyi derlendi ve şikayet etmedi çünkü bir VB.NET projesi sadece .vb dosyalarını derleyecek ve bir C # projesi sadece .cs dosyalarını derleyecektir. Diğerlerini görmezden geliyordu, bu nedenle hata almadınız.

Düzenle: Bir C # projesine bir .vb dosyası eklerseniz, Çözüm Gezgini panelinde dosyayı seçin ve ardından Özellikler paneline bakın, Derleme Eyleminin 'Derleme' değil 'İçerik' olduğunu fark edeceksiniz. Basit bir metin dosyası olarak ele alınır ve derlenmiş derlemede ikili kaynak olarak gömülmez.

Düzenleme: asp.net web siteleri ile vb.net web sitesine c # web kullanıcı kontrolü ekleyebilirsiniz


1
Bundan sonra iki montajı birleştirmenin yolları vardır, ancak bu, bu kullanıcının problemini çözmez.
Steven Sudit

Doğru, ancak bunu yalnızca dilleri karıştırmak amacıyla kabul etmem.
Joel B Fant

Yönetilen ve yönetilmeyen c ++ 'ı aynı projede karıştırabileceğinize inanıyorum.
Callum Rogers

@C Rogers: Bu durum tamamen farklı bir yaratık. İsterseniz aynı kaynak dosyada yönetilen ve yönetilmeyen C ++ 'ı karıştırabilirsiniz. Ama yine de VB.NET ve C # karıştırmakla aynı şey değil.
Joel B Fant

4
@DanHoward: Ouch, yan. Bu kesinlikle orada bir engel, aynı proje içinde dilleri karıştırıp eşleştirememek!

33

Aslında, birkaç yıl önce aynı proje içinde VB ve C # web formlarını karıştırmaya karar veren bir meslektaşımdan bir proje miras aldım. Bu işe yaradı ama sürdürmek eğlenceli olmaktan uzak.

Yeni kodun C # sınıfları olması gerektiğine karar verdim ve onları çalıştırabilmek için web.config'in derleme kısmına bir alt düğüm eklemem gerekti.

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

Tüm VB kodu, App_Code'da VB adı verilen bir alt klasöre ve C # kodu CS alt klasörüne gider. Bu, iki .dll dosyası oluşturacaktır. Çalışır, ancak kod "codeSubDirectories" de listelendiği sırayla derlenir ve bu nedenle, yani Arayüzler hem C # hem de VB'de kullanılırsa VB klasöründe olmalıdır.

Hem bir VB hem de bir C # derleyicisine referans var

<system.codedom>
    <compilers>

Proje şu anda 3.5 çerçevesine güncellendi ve hala çalışıyor (ancak yine de sürdürmek eğlenceli değil ..)



20

Aynı proje içinde vb ve c # karıştırılamaz - eğer visual studio'da proje dosyaları ya .vbproj ya da .csproj olur. Bir çözümün içinde olabilir - vb'de 1 projeye ve c #'da 1 projeye sahip olabilirsiniz.

Görünüşe göre, her ikisini de potansiyel olarak App_Code dizinindeki bir web projesinde kullanabilirsiniz:

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


3
Onlardan montaj üretememenizin nedeni Proje dosyası olmadığı için olumsuz oy verin. İsterseniz, komut satırından derleyiciyi kullanarak bir derlemeyi bir Proje dosyası olmadan derleyebilirsiniz. Çalışmamasının nedeni, bir derlemenin (neredeyse her zaman) bir derleyiciden tek bir derleme işi olmasıdır. Proje dosyasıyla ilgisi yok.
Tom W

8
Olumlu oy verin. Kullanıcıların bakış açısına göre, uzantının farklı olduğu fikri, yapamayacağınız / yapamayacağınız anlamına gelir.
user4951

14

Bazı özel MSBuild geliştirmeleriyle mümkün olabilir. Sağlanan hedefler, projeleri tek bir dil olmaya zorlar - ancak bunu engelleyen herhangi bir çalışma süresi veya araç kısıtlaması yoktur.

Hem VB hem de CS derleyicileri , CLR'nin .obj dosyalarının sürümü olan modüllere çıktı verebilir . Montaj bağlayıcıyı kullanarak, modülleri VB ve CS kodundan alabilir ve tek bir montaj oluşturabilirsiniz.

Bunun önemsiz bir çaba olacağı için değil, ama muhtemelen işe yarayacaktır.


6
Bu konuda Thomas Freudenberg tarafından burada güzel bir yazı var .
Dave M

1
Bunun başka bir örneği, Junfeng Zhang's tarafından Örnek: Yönetilmeyen C ++, C ++ / CLI ve C # kodunun karıştırılmasında bulunabilir . Visual Studio kurulumumdan. \ VC \ bin \ vcvars32.bat'ı ilk çalıştırdıktan sonra çalışmaya başlayabilirdi. Bu aslında farklı dilleri karıştırmak, tek bir proje yerine tek bir derlemedir.
R. Schreurs

7

İzlenecek yol: Bir Web Sitesi Projesinde Birden Çok Programlama Dili Kullanma http://msdn.microsoft.com/en-us/library/ms366714.aspx

Varsayılan olarak, App_Code klasörü birden çok programlama diline izin vermez. Ancak, bir Web sitesi projesinde, Visual Basic ve C # gibi birden çok programlama dilini desteklemek için klasör yapınızı ve yapılandırma ayarlarınızı değiştirebilirsiniz . Bu, ASP.NET'in her dil için bir tane olmak üzere birden çok derleme oluşturmasına olanak tanır. Daha fazla bilgi için bkz. ASP.NET Web Projelerinde Paylaşılan Kod Klasörleri. Geliştiriciler, bağımsız olarak çalışan ve farklı programlama dillerini tercih eden birden çok geliştirme ekibini desteklemek için genellikle Web uygulamalarında birden çok programlama dili içerir.


3

Evet, mümkün. C # ve vb.net projelerini tek bir çözüme eklemek.

1. adım: Dosya-> Ekle-> Mevcut Proje

Adım 2: Proje-> Referans ekle-> daha önce eklediğiniz projenin dll veya exe.

step3: c # formlarını kullanmak istediğiniz vb.net formunda -> projenin ad alanını içe aktarın.


2

Visual Studio bunu desteklemese de (bazı hileler yapabilir ve MSBuild'i her ikisini de derlemek için alabilirsiniz, ancak Visual Studio içinden değil), SharpDevelop desteklemektedir . Her ikisine de aynı çözümde sahip olabilirsiniz (Visual Studio Professional ve üstünü çalıştırdığınız sürece), bu nedenle Visual Studio'yu kullanmaya devam etmek istiyorsanız en kolay çözüm, VB kodunuzu farklı bir projeye ayırmak ve bu şekilde ona erişmek.


1
ShartDevelop bunu nasıl destekliyor? Sadece denedim ve derlenmiyor. Yapılması gereken özel bir şey var mı?
epitka

2

Projeye sağ tıklayın. Asp.Net Klasörü Ekle'yi seçin. Klasör altında, biri VBCodeFiles adlı iki klasör oluşturun ve Web.Config'deki Diğer CSCodeFiles, derleme altına yeni bir öğe ekleyin

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

Şimdi bir cshtml sayfası oluşturun. Kullanarak VBCodeFiles.Namespace.MyClassName öğesine bir başvuru ekleyin

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

MyClassName, yukarıdaki ad alanında bulunan bir sınıf nesnesidir. şimdi bir cshtml dosyası kullanarak nesneyi ustura ile yazın.

<p>@Model.FirstName</p>

Lütfen unutmayın, bu bir C # Projesi ise directoryName = "CSCodeFiles" gereksizdir ve bu bir VB.Net projesiyse directoryName = "VBCodeFiles" gereksizdir.


1

C # derleyicisiyle (veya VB derleyicisiyle) bir projeyi nasıl derleyebileceğinizi ve derleyici için yanlış dilde bunu nasıl yapabileceğinizi anlamıyorum.

C # kodunuzu VB projenizden ayrı bir projede saklayın. Bu projeleri aynı çözüme dahil edebilirsiniz.


1

Dil başına bir projeye ihtiyacınız var. Montajları birleştiren bir araç gördüğüme oldukça eminim, bu aracı bulursanız gitmeniz iyi olur. Her iki dili de aynı sınıfta kullanmanız gerekiyorsa, bunun yarısını VB.net'e yazabilmeli ve sonra geri kalanını VB.net sınıfını miras alarak C # ile yazabilmelisiniz.


1

Her yanıtı tekrarlama riski altında, hayır, bunları aynı projede karıştıramazsınız.

Bunun yanı sıra, VB'yi C #'a dönüştürmeyi yeni bitirdiyseniz, neden VB'de yeni kod yazasınız?


2
Gönderimde bir hata bulduğunuz için :) Dönüştürmeyi henüz bitirmedik.
Wes P

1

.Net 2.0 için bu çalışır. İlgili dil koduyla uygulama içi kodun alt dizinlerini oluşturursanız, her ikisini de aynı projede derler. Henüz 3.5 sürümünde çalışıp çalışmayacağını araştırıyorum.


1

Neden VBkodunuzu bir kitaplıkta .dllderlemiyorsunuz ( ). Daha sonra kodunuzdan referans alın ve hepsi bu. Yönetilen dlls, MSILhem c#ve hem vbde derlenen içerir.


2
Eski VB.NET kodundan yeni C # kodunuzdan herhangi birine başvurmanız gerekirse, tamamen doldurulacaksınız. Ya da tam tersi, hangisine giderseniz gidin, sadece tek yönlü referanslardır.
Roman Starkov

0

Başkalarının da söylediği gibi, ikisini birden tek bir projeye koyamazsınız. Ancak, diğer dildeki bir projeye dahil etmek istediğiniz küçük bir C # veya VB kod parçanız varsa, otomatik dönüştürme araçları vardır . Mükemmel değiller ama çoğu şeyi oldukça iyi yapıyorlar. Ayrıca, SharpDevelop'un yerleşik bir dönüştürme aracı vardır.


Bu var. Sadece onu emebilir ve ihtiyacım olanı VB'de kodlayabilir ve daha sonra diğer şeylerle birlikte dönüştürebilirim.
Wes P

0

Hayır, aynı projede değil ama aynı çözümde kullanabilirsiniz. ancak kodunuzun CLS uyumlu olmasına dikkat etmeniz gerekir. Bu, diğer diller tarafından anlaşılmayan bu tür işlevselliği / özelliği kullanmamış olmanız gerektiği anlamına gelir. Örneğin, VB imzalanmamış girişleri anlamıyor.


0

Bizim senaryomuzda, tek bir çözümde tek bir VB.NET projesi (Windows Masaüstü uygulaması). Bununla birlikte, VB.NET'teki işaretli / işaretsiz tamsayılar ve XML değişmezleri ve dize özellikleri gibi C # özelliklerinden yararlanmak istedik. Bu nedenle, özelliklere bağlı olarak, çalışma zamanında kod dosyasını oluştururuz, ilgili Rosalyn derleyicisini (VB / CS) kullanarak DLL'ye derleriz ve dinamik olarak mevcut derlemeye yükleriz. Elbette dinamik DLL'lerin bağlantılarının kaldırılması, boşaltılması, yeniden yüklenmesi, adlandırılması vb. Üzerinde çalışmak zorunda kaldık ve bellek yönetimi, çatışmayı önlemek için büyük ölçüde adlandırma için dinamik GUID kullanıyorduk. Uygulama kullanıcısının masaüstü uygulamamızdan herhangi bir DB'ye bağlanabileceği, SQL sorgusu yazabileceği, bağlantıyı LINQ bağlantısına dönüştürebileceği ve tümü kaynak kodun dinamik olarak oluşturulmasını, DLL'ye derlenmesini ve mevcut derlemeye eklenmesini gerektiren LINQ sorguları yazabildiği yerlerde iyi çalışır.


-1

Evet, her iki dosyayı da sadece web sitesine ekleyebilirsiniz.Proje bir web uygulaması ise farklı dosya türlerine izin vermeyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.