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

140

Можете ли вы смешать vb и С# файлы в одном проекте для библиотеки классов? Возможна ли настройка?

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

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

  • 8
    Почему вы пишете новый код на VB, если вы только что завершили конвертацию в C #?
  • 0
    Кстати, я подумал, что возможно реализовать гибридный подход с использованием частичных классов в двух разных проектах, но частичные не могут охватывать сборки, поэтому это тоже не сработает.
Показать ещё 6 комментариев
Теги:

18 ответов

122
Лучший ответ

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

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

Изменить: Если вы добавите файл .vb в проект С#, выберите файл в панели Solution Explorer, а затем перейдите на панель "Свойства", вы заметите, что действие сборки - Content ', а не' Compile '. Он рассматривается как простой текстовый файл и даже не внедряется в скомпилированную сборку в виде двоичного ресурса.

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

  • 1
    Существуют способы объединить две сборки по факту, но это не решит проблему этого пользователя.
  • 0
    Правда, но я бы не стал мириться с единственной целью смешивания языков.
Показать ещё 4 комментария
31

Ну, на самом деле я унаследовал проект несколько лет назад от коллеги, который решил смешивать веб-формы VB и С# в рамках одного и того же проекта. Это сработало, но далеки от удовольствия.

Я решил, что новый код должен быть классами С# и заставить их работать. Мне пришлось добавить поднод в часть компиляции web.config

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

Все VB-коды попадают в подпапку в App_Code, называемую VB, и код С# в подкаталог CS. Это приведет к созданию двух DLL файлов. Он работает, но код компилируется в том же порядке, что и в "codeSubDirectories", и поэтому i.e Интерфейсы должны находиться в папке VB, если они используются как в С#, так и в VB.

У меня есть ссылка на VB и компилятор С# в

<system.codedom>
    <compilers>

В настоящее время проект обновлен до версии 3.5, и он по-прежнему работает (но до сих пор не забавно поддерживать.)

20

Вы не можете смешивать vb и С# в одном проекте - если вы заметили в visual studio, файлы проекта либо .vbproj, либо .csproj. Вы можете в пределах решения - иметь 1 proj в vb и 1 в С#.

Похоже, в соответствии с этим вы можете использовать их как в веб-проекте в каталоге App_Code:

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

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

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

Оба компилятора VB и CS могут выводить на модули - версию CLOB файлов .obj. Используя компоновщик компоновки, вы можете взять модули из кода VB и CS и создать единую сборку.

Не то, чтобы это было сложным, но, вероятно, это сработало.

  • 5
    Существует хорошая рецензия на этом Томас Freudenberg здесь .
  • 0
    Другой пример можно найти в примере : Смешивание неуправляемого кода 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 и С#. Это позволяет ASP.NET создавать несколько сборок, по одной для каждого языка. Для получения дополнительной информации см. Общие папки кода в веб-проектах ASP.NET. Разработчики обычно включают несколько языков программирования в веб-приложения для поддержки нескольких групп разработчиков, которые работают независимо и предпочитают разные языки программирования.

6

Проверьте эту ссылку, в которой обсуждается проблема, и показано, как комбинировать код VB и С# в одном проекте, в .NET 4.0

http://msdn.microsoft.com/en-us/library/t990ks23.aspx

  • 1
    Полезно для проектов веб-сайтов ASP.NET, но не для программирования библиотек классов.
2

Да, его возможные.доменные проекты С# и vb.net в одно решение.

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

Шаг 2: Project- > Добавить ссылку- > dll или exe проекта, который u добавил ранее.

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

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>

Обратите внимание: каталогName = "CSCodeFiles" является избыточным, если это проект С#, а directoryName = "VBCodeFiles" избыточен, если это проект VB.Net.

2

Хотя Visual Studio не поддерживает это (вы можете сделать некоторые трюки и заставить MSBuild скомпилировать оба, но не из Visual Studio), SharpDevelop делает. Вы можете иметь как в одном решении (пока вы работаете с Visual Studio Professional и выше), поэтому самое простое решение, если вы хотите использовать Visual Studio, - это разделить ваш код VB на другой проект и получить доступ к нему таким образом.

  • 1
    Как ShartDevelop поддерживает это? Я только попробовал это, и это не компилируется. Что-нибудь особенное, что нужно сделать?
1

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

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

                     

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

1

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

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

1

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

В стороне, если вы только что закончили преобразовывать VB в С#, зачем писать новый код в VB?

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

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

0

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

0

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

0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню