Trộn C # & VB trong cùng một dự án


145

Bạn có thể trộn các tệp vb và c # trong cùng một dự án cho một thư viện lớp không? Có một số thiết lập làm cho nó có thể?

Tôi đã thử và không có intellisense nào hoạt động hoàn toàn đúng, mặc dù trình biên dịch nền dường như xử lý nó đủ tốt (ngoài thực tế là tôi, sau đó, có 2 lớp trong cùng một không gian tên có cùng tên và nó không phàn nàn).

Chúng tôi đang cố gắng chuyển đổi từ VB sang C # nhưng chưa hoàn thành chuyển đổi tất cả mã. Tôi có một số mã mới tôi cần viết, nhưng không thực sự muốn tạo một dự án mới chỉ cho nó.


9
Tại sao bạn viết mã mới trong VB nếu bạn vừa hoàn thành chuyển đổi sang C #?
Adam Robinson

Ngẫu nhiên, tôi nghĩ rằng có thể có thể đưa ra một cách tiếp cận lai bằng cách sử dụng các lớp một phần trong hai dự án khác nhau, nhưng các phần không thể mở rộng các cụm, vì vậy điều này cũng không hiệu quả.
D. Lambert

Dang, đó sẽ là nỗ lực tiếp theo của tôi.
Wes P

1
Đã sửa bài của tôi. Chúng tôi chưa hoàn thành.
Wes P

10
một trong những lý do để trộn mã VB là sử dụng các tính năng độc đáo của nó, đáng chú ý là các khả năng XML của nó nếu bạn đang sử dụng LINQ sang XML chẳng hạn. Bằng cách đó thay vì viết 'từ phần tử trong root.Elements ("Dữ liệu")', bạn có thể sử dụng cú pháp XML động của VB: 'Từ phần tử trong thư mục gốc. <Dữ liệu>'. Khi làm việc nhiều với các tệp XML, cú pháp này có thể dễ làm việc hơn nhiều so với C #
Marchy

Câu trả lời:


128

Không, bạn không thể. Một hội đồng / dự án (mỗi dự án thường biên dịch thành 1 hội đồng) phải là một ngôn ngữ. Tuy nhiên, bạn có thể sử dụng nhiều tập hợp và mỗi tập hợp có thể được mã hóa bằng một ngôn ngữ khác nhau vì tất cả chúng đều được biên dịch thành MSIL.

Nó đã biên dịch tốt và không phàn nàn vì dự án VB.NET sẽ chỉ thực sự biên dịch các tệp .vb và dự án C # sẽ chỉ thực sự biên dịch các tệp .cs. Nó đã bỏ qua những cái khác, do đó bạn không nhận được lỗi.

Chỉnh sửa: Nếu bạn thêm tệp .vb vào dự án C #, hãy chọn tệp trong bảng Solution Explorer và sau đó nhìn vào bảng Thuộc tính, bạn sẽ nhận thấy rằng Build Action là 'Nội dung', không phải 'Biên dịch'. Nó được coi là một tệp văn bản đơn giản và thậm chí không được nhúng trong tập hợp đã biên dịch dưới dạng tài nguyên nhị phân.

Chỉnh sửa: Với các trang web asp.net, bạn có thể thêm quyền kiểm soát người dùng web c # vào trang web vb.net


1
Có nhiều cách để kết hợp hai hội đồng sau khi thực tế, nhưng điều đó sẽ không giải quyết được vấn đề của người dùng này.
Steven Sudit

Đúng, nhưng tôi sẽ không từ bỏ nó cho mục đích duy nhất là trộn các ngôn ngữ.
Joel B Fant

Tôi tin rằng bạn có thể kết hợp c ++ được quản lý và không được quản lý trong cùng một dự án.
Callum Rogers

@C Rogers: Tình huống đó là một critter hoàn toàn khác. Bạn có thể trộn C ++ được quản lý và không được quản lý trong cùng một tệp nguồn nếu bạn muốn. Nhưng nó vẫn không giống như trộn VB.NET và C #.
Joel B Fant

3
@DanHoward: Ouch, đốt cháy. Đó chắc chắn là một khối ở đó, không thể trộn và kết hợp các ngôn ngữ trong cùng một dự án!

32

Chà, thực ra tôi đã thừa hưởng một dự án vài năm trước từ một đồng nghiệp, người đã quyết định trộn các biểu mẫu web VB và C # trong cùng một dự án. Điều đó làm việc nhưng là xa niềm vui để duy trì.

Tôi đã quyết định rằng mã mới phải là các lớp C # và để chúng hoạt động, tôi đã phải thêm một mã con vào phần biên dịch của web.config

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

Tất cả mã VB đi vào một thư mục con trong App_Code được gọi là VB và mã C # vào thư mục con CS. Điều này sẽ tạo ra hai tập tin. Nó hoạt động, nhưng mã được biên dịch theo cùng thứ tự như được liệt kê trong "codeSubDirectories" và do đó, Giao diện phải nằm trong thư mục VB nếu được sử dụng trong cả C # và VB.

Tôi có cả tài liệu tham khảo cho trình biên dịch VB và C # trong

<system.codedom>
    <compilers>

Dự án hiện đang được cập nhật lên khung 3.5 và nó vẫn hoạt động (nhưng vẫn không có gì vui để duy trì ..)


Xem stackoverflow.com/questions/15711964/ cấp để biết thêm chi tiết
John

20

Bạn không thể trộn vb và c # trong cùng một dự án - nếu bạn nhận thấy trong phòng thu trực quan, các tệp dự án là .vbproj hoặc .csproj. Bạn có thể trong một giải pháp - có 1 proj trong vb và 1 trong c #.

Có vẻ như theo điều này, bạn có khả năng có thể sử dụng cả hai trong một dự án web trong thư mục App_Code:

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


3
Downvote vì tệp Project không phải là lý do bạn không thể tạo ra một bản lắp ráp từ chúng. Bạn có thể biên dịch một assembly mà không có tệp Project nào tồn tại nếu bạn muốn, sử dụng trình biên dịch từ dòng lệnh. Lý do nó không hoạt động là một tập hợp (hầu như luôn luôn) một công việc biên dịch từ một trình biên dịch. Không có gì để làm với tập tin dự án.
Tom W

8
Upvote. Từ quan điểm của người dùng, ý tưởng rằng tiện ích mở rộng khác nhau là dấu hiệu nhận biết mà bạn không thể /.
dùng4951

14

Có thể với một số phát triển MSBuild tùy chỉnh. Các mục tiêu được cung cấp buộc các dự án phải là một ngôn ngữ - nhưng không có hạn chế về thời gian chạy hoặc công cụ ngăn chặn điều này.

Cả trình biên dịch VB và CS đều có thể xuất ra các mô-đun - phiên bản tệp .obj của CLR. Sử dụng trình liên kết lắp ráp, bạn có thể lấy các mô-đun từ mã VB và CS và tạo ra một cụm lắp ráp.

Không phải đây sẽ là một nỗ lực tầm thường, nhưng nó có thể sẽ hoạt động.


6
Có một bài viết hay về điều này của Thomas Freudenberg ở đây .
Dave M

1
Một ví dụ khác có thể được tìm thấy trong Mẫu: Trộn mã C ++, C ++ / CLI và mã C # không được quản lý của Junfeng Zhang. Nó có thể làm cho nó hoạt động sau lần chạy đầu tiên. \ VC \ bin \ vcvars32.bat từ cài đặt Visual Studio của tôi. Đây thực sự là sự pha trộn các ngôn ngữ khác nhau là một hội đồng chứ không phải trong một dự án.
R. Schreurs

7

Hướng dẫn: Sử dụng nhiều ngôn ngữ lập trình trong một dự án trang web http://msdn.microsoft.com/en-us/l Library / ms366714.aspx

Theo mặc định, thư mục App_Code không cho phép nhiều ngôn ngữ lập trình. Tuy nhiên, trong một dự án trang Web, bạn có thể sửa đổi cấu trúc thư mục và cài đặt cấu hình để hỗ trợ nhiều ngôn ngữ lập trình như Visual Basic và C # . Điều này cho phép ASP.NET tạo ra nhiều cụm, một cho mỗi ngôn ngữ. Để biết thêm thông tin, hãy xem Thư mục mã được chia sẻ trong các dự án web ASP.NET. Các nhà phát triển thường bao gồm nhiều ngôn ngữ lập trình trong các ứng dụng Web để hỗ trợ nhiều nhóm phát triển hoạt động độc lập và thích các ngôn ngữ lập trình khác nhau.


2

Mặc dù Visual Studio không hỗ trợ điều này (bạn có thể thực hiện một số thủ thuật và yêu cầu MSBuild biên dịch cả hai, nhưng không phải từ bên trong Visual Studio), nhưng SharpDevelop thực hiện. Bạn có thể có cả hai trong cùng một giải pháp (miễn là bạn đang chạy Visual Studio Professional trở lên), vì vậy giải pháp đơn giản nhất nếu bạn muốn tiếp tục sử dụng Visual Studio là tách mã VB của bạn sang một dự án khác và truy cập theo cách đó.


1
ShartDevelop hỗ trợ điều này như thế nào? Tôi chỉ thử nó và nó không biên dịch. Có điều gì đặc biệt cần phải được thực hiện?
epitka

2

Nhấp chuột phải vào Dự án. Chọn Thêm thư mục Asp.Net. Trong Thư mục, tạo hai thư mục một tên là VBCodeFiles và CSCodeFiles khác trong Web.Config thêm một phần tử mới trong quá trình biên dịch

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

Bây giờ, Tạo một trang cshtml. Thêm một tham chiếu đến VBCodeFiles.Namespace.MyClassName bằng cách sử dụng

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

Trong đó MyClassName là một đối tượng lớp được tìm thấy trong không gian tên ở trên. bây giờ viết ra đối tượng bằng dao cạo bằng tệp cshtml.

<p>@Model.FirstName</p>

Xin lưu ý, thư mụcName = "CSCodeFiles" là dự phòng nếu đây là Dự án C # và thư mụcName = "VBCodeFiles" là dự phòng nếu đây là dự án VB.Net.


2

Có, nó có thể. Kết hợp các dự án c # và vb.net vào một giải pháp duy nhất.

bước 1: Tệp-> Thêm-> Dự án hiện có

Bước2: Project-> Thêm tham chiếu-> dll hoặc exe của dự án mà bạn đã thêm trước đó.

step3: Trong mẫu vb.net nơi bạn muốn sử dụng c # Forms-> nhập không gian tên của dự án.


1

Tôi không thấy cách bạn có thể biên dịch một dự án với trình biên dịch C # (hoặc trình biên dịch VB) và không làm cho nó chùn bước với ngôn ngữ sai cho trình biên dịch.

Giữ mã C # của bạn trong một dự án riêng biệt từ dự án VB của bạn. Bạn có thể bao gồm các dự án vào cùng một giải pháp.


1

Bạn cần một dự án cho mỗi ngôn ngữ. Tôi khá tự tin Tôi đã thấy một công cụ hợp nhất các hội đồng, nếu bạn tìm thấy công cụ đó thì bạn nên đi. Nếu bạn cần sử dụng cả hai ngôn ngữ trong cùng một lớp, bạn sẽ có thể viết một nửa trong số đó bằng VB.net và sau đó viết phần còn lại bằng C # bằng cách kế thừa lớp VB.net.


1

Có nguy cơ lặp lại mọi câu trả lời khác, không, bạn không thể trộn chúng trong cùng một dự án.

Điều đó sang một bên, nếu bạn vừa hoàn thành chuyển đổi VB sang C #, tại sao bạn sẽ viết mã mới trong VB?


2
Bởi vì bạn đã tìm thấy một lỗi trong bài viết của tôi :) Chúng tôi chưa chuyển đổi xong.
Wes P

1

Đối với .net 2.0, công việc này. Nó KHÔNG biên dịch cả hai trong cùng một dự án nếu bạn tạo các thư mục con trong mã ứng dụng với mã ngôn ngữ liên quan. Cho đến nay, tôi đang tìm kiếm liệu điều này có nên hoạt động trong 3.5 hay không.


1

Tại sao bạn không biên dịch VBmã của mình vào thư viện ( .dll). Xác nhận lại mã này sau mã của bạn và đó là mã đó. Quản lý dllscó chứa MSILcả hai c#vbđược biên dịch.


2
Bạn sẽ hoàn toàn bị nhồi nếu bạn cần tham khảo bất kỳ mã C # mới nào từ mã VB.NET kế thừa. Hoặc ngược lại, cho dù bạn đi bằng cách nào, đó chỉ là tài liệu tham khảo một chiều.
La Mã Starkov

0

Như những người khác đã nói, bạn không thể đặt cả hai vào một dự án. Tuy nhiên, nếu bạn chỉ có một đoạn mã C # hoặc VB nhỏ mà bạn muốn đưa vào một dự án bằng ngôn ngữ khác, có các công cụ chuyển đổi tự động . Chúng không hoàn hảo, nhưng chúng làm hầu hết mọi thứ khá tốt. Ngoài ra, SharpDevelop có một tiện ích chuyển đổi được tích hợp sẵn.


Có đó. Tôi chỉ có thể hút nó và mã hóa những gì tôi cần trong VB và chuyển đổi nó sau với phần còn lại của công cụ.
Wes P

0

Không, không phải trong cùng một dự án. Nhưng bạn có thể sử dụng chúng trong cùng một giải pháp. mặc dù bạn cần lưu ý rằng mã của bạn tuân thủ CLS. Điều đó có nghĩa là bạn không được sử dụng chức năng / tính năng như vậy mà ngôn ngữ khác không hiểu được. Ví dụ VB không hiểu ints không dấu.


0

Trong kịch bản của chúng tôi, đó là một dự án VB.NET duy nhất (ứng dụng Windows Desktop) trong một giải pháp duy nhất. Tuy nhiên, chúng tôi muốn tận dụng các tính năng của C # như số nguyên đã ký / không dấu và các tính năng chuỗi và ký tự XML trong VB.NET. Vì vậy, tùy thuộc vào các tính năng, trong thời gian chạy, chúng tôi xây dựng tệp mã, biên dịch bằng trình biên dịch Rosalyn (VB / CS) tương ứng thành DLL và tự động tải vào lắp ráp hiện tại. Tất nhiên, chúng tôi phải làm việc với việc xóa, tải, tải lại, đặt tên, v.v. của DLL động và quản lý bộ nhớ, chúng tôi chủ yếu sử dụng GUID động để đặt tên để tránh xung đột. Nó hoạt động tốt khi người dùng ứng dụng có thể kết nối với bất kỳ DB nào từ ứng dụng máy tính để bàn của chúng tôi, viết truy vấn SQL, chuyển đổi kết nối sang kết nối LINQ và viết các truy vấn LINQ, tất cả đều yêu cầu xây dựng mã nguồn động, biên dịch thành DLL và gắn vào cụm hiện tại.


-1

Có, Bạn chỉ có thể thêm cả hai tệp trong trang web. Nếu dự án là một ứng dụng web, nó sẽ không cho phép các loại tệp khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.