การผสม C # & VB ในโครงการเดียวกัน


145

คุณสามารถผสม vb และ c # ไฟล์ในโครงการเดียวกันสำหรับไลบรารีคลาสได้หรือไม่ มีการตั้งค่าบางอย่างที่ทำให้เป็นไปได้หรือไม่?

ฉันพยายามและไม่มี intellisense ทำงานค่อนข้างถูกต้องถึงแม้ว่าคอมไพเลอร์พื้นหลังดูเหมือนว่าจะจัดการได้ดีพอ (นอกเหนือจากความจริงที่ว่าฉันมี 2 คลาสในเนมสเปซเดียวกันที่มีชื่อเดียวกันและไม่บ่น)

เราพยายามแปลงจาก VB เป็น C # แต่ยังไม่เสร็จสิ้นการแปลงรหัสทั้งหมด ฉันมีรหัสใหม่ที่ฉันต้องเขียน แต่ไม่ต้องการสร้างโครงการใหม่เพียงเพื่อมัน


9
ทำไมคุณเขียนรหัสใหม่ใน VB ถ้าคุณเพิ่งแปลงเป็น C # เสร็จแล้ว
Adam Robinson เมื่อ

บังเอิญฉันคิดว่ามันเป็นไปได้ที่จะดึงวิธีไฮบริดออกมาโดยใช้คลาสบางส่วนในสองโครงการที่แตกต่างกัน แต่บางส่วนไม่สามารถขยายแอสเซมบลีได้
D. Lambert

แดงนั่นเป็นความพยายามครั้งต่อไปของฉัน
Wes P

1
แก้ไขโพสต์ของฉัน เรายังไม่เสร็จ
Wes P

10
หนึ่งในเหตุผลที่มีรหัส VB ​​ผสมกันคือการใช้คุณสมบัติที่เป็นเอกลักษณ์โดยเฉพาะอย่างยิ่งความสามารถของ XML หากคุณใช้ LINQ กับ XML ด้วยวิธีนี้แทนที่จะเขียน 'จากองค์ประกอบใน root.Elements ("Data")' คุณสามารถใช้ไวยากรณ์ XML แบบไดนามิกของ VB: 'จากองค์ประกอบในราก <Data>' เมื่อทำงานกับไฟล์ XML บ่อยครั้งไวยากรณ์นี้สามารถทำงานได้ง่ายกว่า C # 's
Marchy

คำตอบ:


128

ไม่คุณไม่สามารถ แอสเซมบลี / โครงการ (แต่ละโครงการคอมไพล์เป็น 1 แอสเซมบลีปกติ) จะต้องเป็นหนึ่งภาษา อย่างไรก็ตามคุณสามารถใช้แอสเซมบลีหลาย ๆ ตัวและแต่ละตัวสามารถเขียนเป็นภาษาอื่นได้เนื่องจากคอมไพล์เหล่านั้นถูกคอมไพล์ไปที่ MSIL

มันรวบรวมได้ดีและไม่ได้บ่นเพราะโครงการ VB.NET จะรวบรวมไฟล์. vb เท่านั้นและโครงการ C # จะรวบรวมไฟล์. cs เท่านั้น มันไม่สนใจสิ่งอื่นดังนั้นคุณจึงไม่ได้รับข้อผิดพลาด

แก้ไข:หากคุณเพิ่มไฟล์. vb ไปยังโครงการ C # ให้เลือกไฟล์ในแผงโซลูชัน Explorer แล้วดูที่แผงคุณสมบัติคุณจะสังเกตเห็นว่าการดำเนินการสร้างเป็น 'เนื้อหา' ไม่ใช่ 'รวบรวม' มันจะถือว่าเป็นไฟล์ข้อความที่เรียบง่ายและไม่ได้รับการฝังตัวในการชุมนุมที่รวบรวมเป็นทรัพยากรไบนารี

แก้ไข:ด้วยเว็บไซต์ asp.net คุณสามารถเพิ่ม c # web user control ให้กับเว็บไซต์ vb.net


1
มีวิธีรวมสองแอสเซมบลีหลังจากข้อเท็จจริง แต่ที่จะไม่แก้ปัญหาของผู้ใช้นี้
Steven Sudit

จริง แต่ฉันจะไม่เอาผิดเพื่อจุดประสงค์ในการผสมภาษาเท่านั้น
Joel B Fant

ฉันเชื่อว่าคุณสามารถผสมผสาน c ++ ที่มีการจัดการและไม่มีการจัดการในโครงการเดียวกัน
Callum Rogers

@C Rogers: สถานการณ์นั้นแตกต่างอย่างสิ้นเชิง คุณสามารถผสม C ++ ที่มีการจัดการและไม่มีการจัดการในไฟล์ต้นฉบับเดียวกันหากคุณต้องการ แต่ก็ยังไม่เหมือนกับการผสม VB.NET และ C #
Joel B Fant

3
@ DanHoward: โอชาเผา นั่นเป็นบล็อกที่แน่นอนไม่สามารถผสมและจับคู่ภาษาในโครงการเดียวกันได้!

32

จริงๆแล้วฉันได้รับมรดกโครงการเมื่อหลายปีก่อนจากเพื่อนร่วมงานที่ตัดสินใจผสม VB และ C # webforms ในโครงการเดียวกัน มันใช้งานได้ แต่อยู่ไกลจากความสนุกในการดูแล

ฉันตัดสินใจว่ารหัสใหม่ควรเป็นคลาส C # และเพื่อให้ทำงานฉันต้องเพิ่มโหนดย่อยในส่วนการรวบรวมของ web.config

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

รหัส VB ​​ทั้งหมดจะเข้าสู่โฟลเดอร์ย่อยใน App_Code ชื่อ VB และรหัส C # ลงในโฟลเดอร์ย่อย CS สิ่งนี้จะสร้างไฟล์. dll สองไฟล์ มันใช้งานได้ แต่โค้ดถูกคอมไพล์ในลำดับเดียวกับที่ระบุใน "codeSubDirectories" ดังนั้นการเชื่อมต่อควรอยู่ในโฟลเดอร์ VB หากใช้ทั้ง C # และ VB

ฉันมีทั้งการอ้างอิงถึง VB และคอมไพเลอร์ C #

<system.codedom>
    <compilers>

ขณะนี้โครงการได้รับการอัปเดตเป็นกรอบ 3.5 และยังคงใช้งานได้ (แต่ก็ยังไม่สนุกที่จะดูแล .. )


ดูstackoverflow.com/questions/15711964/…สำหรับรายละเอียดเพิ่มเติม
John

20

คุณไม่สามารถผสม vb และ c # ภายในโครงการเดียวกัน - หากคุณสังเกตเห็นใน visual studio ไฟล์โครงการจะเป็น. vbproj หรือ. csproj คุณสามารถแก้ปัญหาได้ - มี 1 โปรเจกต์ใน vb และ 1 ใน c #

ดูเหมือนว่าคุณสามารถใช้ทั้งสองในโครงการเว็บในไดเรกทอรี App_Code:

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


3
Downvote เนื่องจากไฟล์ Project ไม่ใช่เหตุผลที่คุณไม่สามารถสร้างชุดประกอบได้ คุณสามารถรวบรวมแอสเซมบลีโดยไม่มีไฟล์โครงการที่เคยมีอยู่หากคุณต้องการโดยใช้คอมไพเลอร์จากบรรทัดคำสั่ง เหตุผลที่มันไม่ทำงานคือแอสเซมบลีคือ (เกือบทุกครั้ง) หนึ่งงานรวบรวมจากคอมไพเลอร์หนึ่ง ไม่มีอะไรเกี่ยวข้องกับไฟล์โครงการ
Tom W

8
upvote จากมุมมองของผู้ใช้แนวคิดที่ว่าส่วนขยายนั้นแตกต่างกันเป็นสัญญาณบอกเล่าที่คุณไม่สามารถ /
user4951

14

อาจเป็นไปได้ด้วยการพัฒนา MSBuild ที่กำหนดเอง .targets ที่ให้มาบังคับให้โครงการเป็นภาษาเดียว - แต่ไม่มีการ จำกัด รันไทม์หรือเครื่องมือในการป้องกันสิ่งนี้

ทั้งคอมไพเลอร์ VB และ CS สามารถส่งออกไปยังโมดูล - ไฟล์. obj เวอร์ชัน CLR การใช้แอสเซมบลี linker คุณสามารถใช้โมดูลจากรหัส VB ​​และ CS และสร้างแอสเซมบลีเดียว

ไม่ใช่ว่านี่จะเป็นความพยายามอย่างยิ่งยวด แต่อาจเป็นไปได้


6
มีดีเขียนขึ้นเกี่ยวกับเรื่องนี้โดยโทมัส Freudenberg เป็นที่นี่
เดฟ M

1
อีกตัวอย่างหนึ่งของสามารถพบได้ในตัวอย่าง: การผสม C ++, C ++ / CLI, และโค้ด C #โดย Junfeng Zhang มันสามารถทำงานได้หลังจากใช้งานครั้งแรก \ VC \ bin \ vcvars32.bat จากการติดตั้ง Visual Studio ของฉัน นี่คือการผสมภาษาที่แตกต่างกันเป็นชุดเดียวมากกว่าหนึ่งโครงการ
R. Schreurs

7

เกมส์: การใช้ภาษาการเขียนโปรแกรมหลายภาษาในโครงการเว็บไซต์ http://msdn.microsoft.com/en-us/library/ms366714.aspx

ตามค่าเริ่มต้นโฟลเดอร์ App_Code ไม่อนุญาตให้ใช้ภาษาการเขียนโปรแกรมหลายภาษา อย่างไรก็ตามในโครงการเว็บไซต์คุณสามารถปรับเปลี่ยนโครงสร้างและการกำหนดค่าการตั้งค่าโฟลเดอร์ของคุณเพื่อสนับสนุนการเขียนโปรแกรมภาษาหลายเช่น Visual Basic และ C # สิ่งนี้จะช่วยให้ ASP.NET สร้างแอสเซมบลีได้หลายรายการโดยแต่ละแอสเซมบลีสำหรับแต่ละภาษา สำหรับข้อมูลเพิ่มเติมดูโฟลเดอร์รหัสที่ใช้ร่วมกันในโครงการเว็บ ASP.NET นักพัฒนามักรวมภาษาการเขียนโปรแกรมหลายภาษาไว้ในเว็บแอปพลิเคชันเพื่อสนับสนุนทีมพัฒนาหลายคนที่ทำงานอย่างอิสระและต้องการภาษาโปรแกรมที่แตกต่างกัน


2

แม้ว่า Visual Studio จะไม่รองรับสิ่งนี้ (คุณสามารถใช้กลอุบายและรับ MSBuild เพื่อคอมไพล์ทั้งสอง แต่ไม่ใช่จากภายใน Visual Studio), SharpDevelopทำเช่นนั้น คุณสามารถมีทั้งสองอย่างในโซลูชันเดียวกัน (ตราบใดที่คุณใช้ Visual Studio Professional ขึ้นไป) ดังนั้นทางออกที่ง่ายที่สุดถ้าคุณต้องการใช้ Visual Studio ต่อไปคือการแยกรหัส VB ​​ของคุณออกเป็นโครงการอื่นและเข้าถึงด้วยวิธีนั้น


1
ShartDevelop สนับสนุนสิ่งนี้อย่างไร ฉันลองแล้วไม่ได้คอมไพล์ มีอะไรพิเศษที่ต้องทำหรือไม่?
epitka

2

คลิกขวาที่โครงการ เลือกเพิ่มโฟลเดอร์ Asp.Net ภายใต้โฟลเดอร์ให้สร้างสองโฟลเดอร์หนึ่งชื่อ VBCodeFiles และ Other CSCodeFiles ใน Web.Config เพิ่มองค์ประกอบใหม่ภายใต้การรวบรวม

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

ตอนนี้สร้างหน้า cshtml เพิ่มการอ้างอิงถึง VBCodeFiles.Namespace.MyClassName โดยใช้

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

โดยที่ MyClassName เป็นอ็อบเจ็กต์คลาสที่พบในเนมสเปซด้านบน ตอนนี้เขียนออบเจ็กต์ด้วยมีดโกนโดยใช้ไฟล์ cshtml

<p>@Model.FirstName</p>

โปรดทราบว่า directoryName = "CSCodeFiles" ซ้ำซ้อนหากนี่เป็นโครงการ C # และ directoryName = "VBCodeFiles" ซ้ำซ้อนหากเป็นโครงการ VB.Net


2

ใช่เป็นไปได้เพิ่มโครงการ c # และ vb.net ลงในโซลูชันเดียว

ขั้นที่ 1: ไฟล์ -> เพิ่ม -> โครงการที่มีอยู่

ขั้นที่ 2: โครงการ -> เพิ่มการอ้างอิง -> dll หรือ exe ของโครงการที่คุณเพิ่มมาก่อน

ขั้นที่ 3: ในรูปแบบ vb.net ที่คุณต้องการใช้ c # Forms-> นำเข้า namespace ของโครงการ


1

ฉันไม่เห็นวิธีที่คุณสามารถคอมไพล์โปรเจ็กต์ด้วยคอมไพเลอร์ C # (หรือคอมไพเลอร์ VB) และไม่มีการผิดพลาดในภาษาที่ผิดสำหรับคอมไพเลอร์

เก็บรหัส C # ของคุณในโครงการแยกต่างหากจากโครงการ VB ของคุณ คุณสามารถรวมโครงการเหล่านี้ไว้ในโซลูชันเดียวกัน


1

คุณต้องใช้หนึ่งโครงการต่อหนึ่งภาษา ฉันค่อนข้างมั่นใจว่าฉันเห็นเครื่องมือที่รวมแอสเซมบลีถ้าคุณพบว่าเครื่องมือที่คุณควรจะไป ถ้าคุณต้องการใช้ทั้งสองภาษาในคลาสเดียวกันคุณควรเขียนครึ่งหนึ่งของภาษานั้นใน VB.net แล้วเขียนส่วนที่เหลือใน C # โดยสืบทอดคลาส VB.net


1

ความเสี่ยงในการสะท้อนคำตอบอื่น ๆ ไม่ใช่คุณไม่สามารถผสมคำตอบในโครงการเดียวกันได้

ถ้าคุณเพิ่งแปลง VB เป็น C # เสร็จแล้วทำไมคุณต้องเขียนโค้ดใหม่ใน VB?


2
เนื่องจากคุณพบข้อผิดพลาดในโพสต์ของฉัน :) เรายังแปลงไม่เสร็จ
Wes P

1

สำหรับ. net 2.0 ใช้งานได้ มันรวบรวมทั้งในโครงการเดียวกันถ้าคุณสร้างไดเรกทอรีย่อยของในรหัสแอปด้วยรหัสภาษาที่เกี่ยวข้อง ณ ตอนนี้ฉันกำลังมองหาว่ามันจะทำงานได้ใน 3.5 หรือไม่


1

ทำไมคุณไม่คอมไพล์VBโค้ดของคุณลงใน.dllไลบรารี่( ) โดยอ้างอิงจากโค้ดของคุณในภายหลัง การจัดการdllsประกอบด้วยMSILที่ทั้งสองc#และvbรวบรวม


2
คุณจะถูกยัดไส้อย่างสมบูรณ์หากคุณต้องการอ้างอิงรหัส C # ใหม่ของคุณจากรหัส VB.NET เดิม หรือในทางกลับกันไม่ว่าคุณจะไปทางไหนมันเป็นการอ้างอิงทางเดียวเท่านั้น
Roman Starkov

0

อย่างที่คนอื่นพูดคุณไม่สามารถใส่ทั้งสองอย่างไว้ในโครงการเดียว แต่ถ้าคุณมีเพียงชิ้นเล็ก ๆ ของ C # หรือ VB รหัสที่คุณต้องการรวมไว้ในโครงการในภาษาอื่น ๆ ที่มีอัตโนมัติเครื่องมือการแปลง พวกเขาไม่ได้สมบูรณ์แบบ แต่พวกเขาทำสิ่งที่ดีที่สุด นอกจากนี้SharpDevelopยังมียูทิลิตี้การแปลงในตัว


นั่นก็คือ ฉันสามารถดูดมันขึ้นมาและเขียนโค้ดสิ่งที่ฉันต้องการใน VB และแปลงมันในภายหลังด้วยส่วนอื่น ๆ
Wes P

0

ไม่ไม่ได้อยู่ในโครงการเดียวกัน แต่คุณสามารถใช้มันในโซลูชันเดียวกันได้ แม้ว่าคุณจะต้องดูแลว่ารหัสของคุณเป็นไปตาม CLS ซึ่งหมายความว่าคุณต้องไม่ใช้ฟังก์ชัน / คุณสมบัติดังกล่าวที่ไม่เข้าใจภาษาอื่น ตัวอย่างเช่น VB ไม่เข้าใจ ints ที่ไม่ได้ลงชื่อ


0

ในสถานการณ์ของเราโครงการ VB.NET เดียว (แอปพลิเคชัน Windows Desktop) ในโซลูชันเดียว อย่างไรก็ตามเราต้องการใช้ประโยชน์จากฟีเจอร์ C # เช่นจำนวนเต็มที่ลงนาม / ไม่ได้ลงนามและตัวอักษร XML และคุณสมบัติสตริงใน VB.NET ดังนั้นขึ้นอยู่กับคุณสมบัติที่รันไทม์เราสร้างไฟล์โค้ดรวบรวมโดยใช้คอมไพเลอร์ Rosalyn (VB / CS) ตามลำดับลงใน DLL และโหลดเข้าสู่แอสเซมบลีปัจจุบันแบบไดนามิก แน่นอนว่าเราต้องทำงานกับ delinking, unloading, reloading, ตั้งชื่อ etc ของ dynamic DLLs และการจัดการหน่วยความจำเราส่วนใหญ่ใช้ dynamic GUID สำหรับการตั้งชื่อเพื่อหลีกเลี่ยงความขัดแย้ง มันทำงานได้ดีที่ผู้ใช้แอพสามารถเชื่อมต่อกับฐานข้อมูลใด ๆ จากแอพเดสก์ท็อปของเราเขียนแบบสอบถาม SQL แปลงการเชื่อมต่อไปยังการเชื่อมต่อ LINQ และเขียนคำสั่ง LINQ ด้วยซึ่งทั้งหมดต้องใช้การสร้างซอร์สโค้ดแบบไดนามิก


-1

ใช่คุณสามารถเพิ่มทั้งสองไฟล์ในเว็บไซต์เท่านั้นหากโครงการเป็นเว็บแอปพลิเคชันจะไม่อนุญาตให้ใช้ไฟล์ประเภทอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.