2009-08-14 3 views
124

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

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

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

+7

Почему вы пишете новый код в VB, если только что закончили конвертировать в C#? –

+1

Исправлено сообщение. Мы еще не закончили. –

+9

Одна из причин, по которой смешанный код VB заключается в использовании его уникальных функций, особенно его возможностей XML, если вы используете LINQ to XML, например. Таким образом, вместо того, чтобы писать «из элемента в root.Elements (« Data »), вы можете использовать динамический синтаксис XML VB:« От элемента In root. '. При работе с XML-файлами этот синтаксис может быть намного проще работать, чем с C# – Marchy

ответ

113

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

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

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

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

+1

Есть способы объединить две сборки после факта, но это не решит проблему этого пользователя. –

+0

Правда, но я бы не потворствовал этому с единственной целью смешивания языков. –

+0

Я считаю, что вы можете смешивать управляемый и неуправляемый C++ в том же проекте. –

1

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

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

19

Вы не можете смешивать vb и C# в рамках одного проекта - если вы заметили в visual studio, файлы проекта либо .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

Downvote, потому что файл проекта не является причиной того, что вы не можете создать сборку из них. Вы можете скомпилировать сборку без файла проекта, когда-либо существовавшего, если хотите, используя компилятор из командной строки. Причина, по которой он не будет работать, заключается в том, что сборка (почти всегда) - одно компиляционное задание от одного компилятора. Это не связано с файлом проекта. –

+6

Upvote. С точки зрения пользователей идея о том, что расширение отличается, - это контрольный знак, который вы не можете /. –

1

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

0

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

+0

Есть это. Я мог бы просто сосать его и закодировать то, что мне нужно, в VB и преобразовать его позже с остальной частью материала. –

1

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

Это в сторону, если вы только что закончили конвертировать VB в C#, зачем вам писать новый код в VB?

+2

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

10

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

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

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

+5

Существует хорошая рецензия на это Томасом Фрейденбергом [здесь] (http://thomasfreudenberg.com/blog/archive/2006/08/22/Mixing-C_2300_-and-VB.NET-in-one-assembly .aspx). –

+0

Другой пример можно найти в [Пример: Смешивание неуправляемого кода на C++, C++/CLI и C#] (http://blogs.msdn.com/b/junfeng/archive/2006/05/20/599434.aspx) by Junfeng Zhang's. Это может заставить его работать после первого запуска. \ VC \ bin \ vcvars32.bat из моей установки Visual Studio. Это фактически смешивание разных языков - это одна сборка, а не один проект. –

2

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

+1

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

1

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

29

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

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

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

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

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

<system.codedom> 
    <compilers> 

Проект в настоящее время обновляется в рамках 3.5 и он все еще работает (но не интересно для поддержания ..)

+0

См. Http://stackoverflow.com/questions/15711964/converting-an-asp-net-website-that-has-c-sharp-and-vb-to-a-web-application для получения более подробной информации. – John

1

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

+2

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

6

Краткое руководство: Использование нескольких языков программирования в веб-сайт проекта http://msdn.microsoft.com/en-us/library/ms366714.aspx

По умолчанию папка App_Code не позволяет нескольких языков программирования. Тем не менее, в проекте веб-сайта вы можете изменить структуру папок и параметры конфигурации для поддержки нескольких языков программирования, таких как Visual Basic и C#. Это позволяет ASP.NET создавать несколько сборок, по одному для каждого языка. Дополнительные сведения см. В разделе Папки общего кода в веб-проектах ASP.NET.Разработчики обычно включают в себя несколько языков программирования в веб-приложениях для поддержки нескольких групп разработчиков, которые работают независимо и предпочитают разные языки программирования.

6

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

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

+1

Полезно для проектов ASP.NET Website, но не для программирования библиотеки классов. – devlord

0

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

-1

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

1

Щелкните правой кнопкой мыши проект. Выберите Добавить папку 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.

1

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

step1: File-> Add-> Существующий проект

Шаг2: Проект-> Добавить Справочно> DLL или EXE-файла проекта, который у добавленного ранее.

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

Смежные вопросы