Змішування C # та VB у тому ж проекті


145

Чи можете ви змішувати файли vb та c # в одному проекті для бібліотеки класів? Чи є якась настройка, яка робить це можливим?

Я спробував, і жоден з intellisense не працює цілком правильно, хоча, здається, фоновий компілятор справляється з цим досить добре (окрім того, що я тоді мав 2 класи в тій самій області імен з тим самим іменем, і він не скаржився).

Ми намагаємося перетворити з VB в C #, але не закінчили конвертувати весь код. У мене є новий код, який мені потрібно написати, але не дуже хотілося робити новий проект саме для цього.


9
Чому ви пишете новий код у VB, якщо ви щойно закінчили перехід на C #?
Адам Робінсон

Між іншим, я подумав, що можливо, можна використати гібридний підхід за допомогою часткових класів у двох різних проектах, але партії не можуть охоплювати складання, тому це теж не буде працювати.
Д. Ламберт

Данг, це була моя наступна спроба.
Уес П

1
Виправлена ​​моя посада. Ми ще не закінчили.
Уес П

10
Однією з причин змішування коду VB є використання його унікальних функцій, зокрема його можливостей XML, якщо, наприклад, ви використовуєте LINQ до XML. Таким чином, замість того, щоб писати "з елемента в root.Elements (" Дані ")", ви можете використовувати динамічний синтаксис XML VB: "Від елемента в корені. <Дані>". Під час роботи з XML-файлами працювати з цим синтаксисом можна набагато простіше, ніж на C #
March

Відповіді:


128

Ні, ти не можеш. Збірка / проект (кожен проект складається в одному складі, як правило) має бути однією мовою. Однак ви можете використовувати декілька збірок, і кожна може бути закодована іншою мовою, оскільки всі вони складені в MSIL.

Він складений штрафом і не скаржився, оскільки проект VB.NET фактично компілює лише файли .vb, а проект C # лише фактично компілює файли .cs. Це було ігнорування інших, тому ви не отримували помилок.

Редагувати: Якщо ви додасте .vb файл до проекту C #, виберіть файл на панелі Провідника рішень і перегляньте панель Властивості, ви помітите, що дія збірки - "Зміст", а не "Компілювати". Це трактується як простий текстовий файл і навіть не вбудовується у складену збірку як бінарний ресурс.

Редагувати: На веб-сайтах asp.net ви можете додавати c # веб-контроль користувачів на веб-сайт vb.net


1
Існують способи поєднання двох збірок після факту, але це не вирішило б проблеми цього користувача.
Стівен Судіт

Щоправда, але я не потураю це єдиній меті змішанню мов.
Джоель Б Фант

Я вважаю, що ви можете змішати керований та некерований c ++ в одному проекті.
Callum Rogers

@ C Роджерс: Ця ситуація зовсім інша суть. Ви можете змішати керований та некерований C ++ у тому самому вихідному файлі, якщо хочете. Але це все одно не те саме, що змішувати VB.NET і C #.
Джоель Б Фант

3
@DanHoward: Ой, спалюй. Це, безумовно, блок там, не в змозі змішувати мови та відповідати в рамках одного проекту!

32

Ну, насправді я успадкував проект кілька років тому від колеги, яка вирішила змішати веб-форми VB та C # в рамках одного проекту. Це спрацювало, але підтримувати далеко не цікаво.

Я вирішив, що новий код повинен бути класами 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/… для більш детальної інформації
Іван

20

Ви не можете змішувати vb і c # в рамках одного проекту - якщо ви помітили у візуальній студії, файли проекту є .vbproj або .csproj. Ви можете в рамках рішення - мати 1 proj в 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
Зниження голосу, оскільки файл проекту не є причиною того, що ви не можете створити з них збірку. Ви можете скласти збірку без файлу Project, який існував, якщо ви хочете, використовуючи компілятор з командного рядка. Причина, що вона не працює, полягає в тому, що збірка - це (майже завжди) одне завдання з компіляції від одного компілятора. Це не має нічого спільного з файлом проекту.
Том Ш

8
Оновлення З точки зору користувачів, думка про те, що розширення відрізняється, є знаковим знаком, який ви не можете /.
user4951

14

Це може бути можливим за допомогою певної розробки MSBuild. Поставлені.

І VB, і CS компілятори можуть виводити модулі - CLR-файли .obj-файлів. Використовуючи лінкер складання, ви можете взяти модулі з коду VB та CS та створити одну збірку.

Не те, щоб це було випробуванням, але, мабуть, спрацювало б.


6
Існує гарна рецензія на цьому Томас Freudenberg тут .
Дейв М

1
Інший приклад можна знайти в зразку: Змішування некерованого C ++, C ++ / CLI та C # коду від Junfeng Zhang's. Це може працювати після першого запуску. \ VC \ bin \ vcvars32.bat з моєї установки Visual Studio. Це насправді змішування різних мов - це одна збірка, а не один проект.
Р. Шреурс

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 та інші 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

Так, це можливо.adding c # і vb.net проектує в єдине рішення.

крок1: Файл-> Додати-> Існуючий проект

Крок 2: Проект-> Додати посилання-> dll або exe проекту, який ви додали раніше.

step3: у формі vb.net, де ви хочете використовувати c # form-> імпорт простору імен проекту.


1

Я не бачу, як ви можете скласти проект за допомогою компілятора C # (або компілятора VB), і не мати його на невірній мові для компілятора.

Зберігайте свій код C # в окремому проекті від проекту VB. Ви можете включити ці проекти до одного рішення.


1

Вам потрібен один проект на кожну мову. Я впевнений, що побачив інструмент, який об'єднав збірки, якщо ви знайдете цей інструмент, вам слід добре зайти. Якщо вам потрібно використовувати обидві мови в одному класі, ви повинні мати змогу записати половину її в скажімо VB.net, а потім написати решту в C #, успадкувавши клас VB.net.


1

Загрожуючи повторити кожну іншу відповідь, ні, ви не можете змішати їх у одному проекті.

Це вбік, якщо ви тільки що закінчили перетворювати VB в C #, чому б ви писали новий код у VB?


2
Тому що ви знайшли помилку в моєму дописі :) Ми ще не закінчили конвертувати.
Уес П

1

Для .net 2.0 це працює. Вона компілюється як в одному проекті, якщо ви створюєте підкаталоги в коді додатка із відповідним мовним кодом. Поки я шукаю, чи має це працювати в 3,5 чи ні.


1

Чому б ти просто не зібрати свій VBкод у бібліотеку ( .dll). Зверніться до нього пізніше зі свого коду, і все. Керовані dllsмістять, MSILдо яких c#і vbкомпілюються.


2
Ви будете повністю заповнені, якщо вам коли-небудь доведеться посилатися на будь-який ваш новий код C # із застарілого коду VB.NET. Або навпаки, куди б ви не пішли, це лише односторонні посилання.
Роман Старков

0

Як говорили інші, ви не можете розмістити обох в одному проекті. Однак якщо у вас є лише невеликий фрагмент коду C # або VB, який ви хочете включити в проект іншою мовою, є інструменти автоматичного перетворення . Вони не ідеальні, але вони роблять більшість справ досить добре. Також у SharpDevelop вбудована утиліта перетворення.


Є те. Я міг би просто висмоктати його і кодувати те, що мені потрібно в VB, і перетворити його згодом з рештою матеріалів.
Уес П

0

Ні, не в одному проекті.але ви можете використовувати їх у тому самому рішенні. хоча вам потрібно подбати про те, щоб ваш код відповідав CLS. Це означає, що ви не повинні використовувати таку функціональність / функцію, яку не розуміє інша мова. Наприклад, VB не розуміє неподписані вставки.


0

У нашому сценарії це єдиний проект VB.NET (додаток для робочого столу Windows) в єдиному рішенні. Однак ми хотіли скористатися такими функціями, як C #, як підписані / непідписані цілі числа та XML-літерали та рядкові функції у VB.NET. Отже, залежно від особливостей, під час виконання ми будуємо файл коду, компілюємо за допомогою відповідного компілятора Rosalyn (VB / CS) в DLL і динамічно завантажуємо в поточну збірку. Звичайно, нам довелося працювати над розмежуванням, розвантаженням, перезавантаженням, називанням тощо динамічних DLL-файлів та управління пам'яттю, якщо ми багато в чому використовували динамічний GUID для іменування, щоб уникнути конфлікту. Це чудово працює, коли користувач програми може підключитися до будь-якої БД з нашого настільного додатка, написати SQL-запит, перетворити з'єднання в LINQ-з'єднання і також записувати LINQ-запити, для чого все вимагає динамічної побудови вихідного коду, компіляції в DLL та приєднання до поточної збірки.


-1

Так, ви можете додати обидва файли лише на веб-сайті. Якщо проект є веб-додатком, він не дозволяє файлів різного типу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.