Смешивание C # и VB в том же проекте

145

Можете ли вы смешать файлы VB и C # в одном проекте для библиотеки классов? Есть ли какая-то настройка, которая делает это возможным?

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

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

Уэс П
источник
9
Почему вы пишете новый код на VB, если вы только что завершили конвертацию в C #?
Адам Робинсон
Кстати, я подумал, что возможно реализовать гибридный подход с использованием частичных классов в двух разных проектах, но частичные не могут охватывать сборки, поэтому это тоже не сработает.
Д. Ламберт
Черт, это будет моя следующая попытка.
Wes P
1
Исправил мой пост. Мы еще не закончили.
Wes P
10
Одна из причин смешивания VB-кода заключается в использовании его уникальных функций, в частности, его возможностей XML, например, если вы используете LINQ to XML. Таким образом, вместо записи «from element in root.Elements (« Data »)» вы можете использовать динамический синтаксис VB XML: «From element In root. <Data>». При большой работе с файлами XML этот синтаксис может быть намного проще работать, чем в C #
Marchy

Ответы:

129

Нет, ты не можешь. Сборка / проект (каждый проект обычно компилируется в 1 сборку) должен быть одним языком. Однако вы можете использовать несколько сборок, каждая из которых может быть закодирована на другом языке, потому что все они скомпилированы в MSIL.

Он скомпилирован нормально и не жаловался, потому что проект VB.NET на самом деле компилирует только файлы .vb, а проект C # на самом деле компилирует только файлы .cs. Он игнорировал другие, поэтому вы не получили ошибок.

Редактировать: если вы добавляете файл .vb в проект C #, выберите этот файл на панели обозревателя решений, а затем посмотрите на панель «Свойства», и вы заметите, что действие «Построение» - это «Содержимое», а не «Компиляция». Он рассматривается как простой текстовый файл и даже не внедряется в скомпилированную сборку как бинарный ресурс.

Изменить: На сайтах asp.net вы можете добавить пользовательский элемент управления c # на сайт vb.net

Джоэл Б Фант
источник
1
Существуют способы объединить две сборки по факту, но это не решит проблему этого пользователя.
Стивен Судит
Правда, но я бы не стал мириться с единственной целью смешивания языков.
Джоэл Би Фэнт
Я считаю, что вы можете смешивать управляемый и неуправляемый c ++ в одном проекте.
Каллум Роджерс
@C Роджерс: Эта ситуация совсем другая. Вы можете смешать управляемый и неуправляемый C ++ в одном и том же исходном файле, если хотите. Но это все равно, что смешивать VB.NET и C #.
Джоэл Б Фант
4
@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 # в одном проекте - если вы заметили, что в 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

Brendan
источник
3
Downvote, потому что файл Project не является причиной, по которой вы не можете создать сборку из них. При желании вы можете скомпилировать сборку без файла Project, используя компилятор из командной строки. Причина, по которой это не сработает, заключается в том, что сборка - это (почти всегда) одно задание компиляции от одного компилятора. Это не имеет ничего общего с файлом проекта.
Том W
8
Upvote. С точки зрения пользователей, идея о том, что расширение отличается, является показательным признаком того, что вы не можете /.
user4951
14

Это может быть возможно с помощью некоторой пользовательской разработки MSBuild. Поставляемые .targets заставляют проекты быть на одном языке - но нет ограничений времени выполнения или инструментария, предотвращающих это.

Оба компилятора 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. Разработчики обычно включают несколько языков программирования в веб-приложения для поддержки нескольких групп разработчиков, которые работают независимо и предпочитают разные языки программирования.

gerryLowry
источник
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.

RickIsWright
источник
2

Да, это возможно. Добавление проектов c # и vb.net в одно решение.

шаг1: Файл-> Добавить-> Существующий проект

Шаг 2: Project-> Add reference-> dll или exe проекта, который вы добавили ранее.

Шаг 3: В форме vb.net, где вы хотите использовать c # forms-> import namespace проекта.

user6808128
источник
1

Я не понимаю, как вы можете скомпилировать проект с помощью компилятора C # (или VB-компилятора) и не допустить его несоответствия языку компилятора.

Храните ваш код C # в отдельном проекте от вашего проекта VB. Вы можете включить эти проекты в одно и то же решение.

узда
источник
1

Вам нужен один проект на язык. Я совершенно уверен, что видел инструмент, объединяющий сборки, если вы найдете этот инструмент, вам стоит поработать. Если вам нужно использовать оба языка в одном и том же классе, вы сможете написать половину из них, скажем, на VB.net, а затем написать остальные на C #, наследуя класс VB.net.

svinto
источник
1

С риском повторения любого другого ответа, нет, вы не можете смешивать их в одном проекте.

Кроме того, если вы только что завершили конвертацию VB в C #, зачем писать новый код на VB?

Адам Робинсон
источник
2
Потому что вы нашли ошибку в моем сообщении :) Мы еще не завершили конвертацию.
Wes P
1

Для .net 2.0 это работает. Он скомпилирует оба в одном проекте, если вы создаете подкаталоги в коде приложения с кодом соответствующего языка. На данный момент я ищу, должно ли это работать в 3.5 или нет, хотя.

mgbeers
источник
1

Почему бы вам просто не скомпилировать свой VBкод в библиотеку ( .dll). Ссылка на него позже из вашего кода и все. Управляется dllsконтентом, MSILк которому оба c#и vbкомпилируются.

Ajov
источник
2
Вы будете полностью напичканы, если вам когда-нибудь понадобится ссылаться на любой новый код C # из старого кода VB.NET. Или наоборот, какой бы путь вы ни выбрали, это только односторонние ссылки.
Роман Старков
0

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

Скотт Уитлок
источник
Это так. Я мог бы просто смириться с этим и закодировать то, что мне нужно, в VB и преобразовать его позже с остальными вещами.
Wes P
0

Нет, не в одном проекте. Но вы можете использовать их в одном решении. хотя вам нужно позаботиться о том, чтобы ваш код соответствовал CLS. Это означает, что вы не должны использовать такую ​​функциональность / функцию, которую не понимает другой язык. Например, VB не понимает целые числа без знака.

Джухи
источник
0

В нашем сценарии это один проект VB.NET (приложение Windows Desktop) в одном решении. Однако мы хотели воспользоваться возможностями C #, такими как целые числа со знаком / без знака, литералы XML и строковые функции в VB.NET. Таким образом, в зависимости от функций, во время выполнения мы создаем файл кода, компилируем с использованием соответствующего компилятора Rosalyn (VB / CS) в DLL и динамически загружаем в текущую сборку. Конечно, нам пришлось работать над разделением, выгрузкой, перезагрузкой, именованием и т. Д. Динамических библиотек DLL и управлением памятью, где мы в основном использовали динамический GUID для именования, чтобы избежать конфликта. Это прекрасно работает, когда пользователь приложения может подключиться к любой БД из нашего настольного приложения, написать запрос SQL, преобразовать соединение в соединение LINQ и также написать запросы LINQ, что требует динамического построения исходного кода, компиляции в DLL и присоединения к текущей сборке.

Venkat
источник
-1

Да, вы можете добавить оба файла только на веб-сайте. Если проект является веб-приложением, он не разрешит использовать файлы другого типа.

питон
источник