동일한 프로젝트에서 C # 및 VB 혼합


145

클래스 라이브러리의 동일한 프로젝트에서 vb 및 c # 파일을 혼합 할 수 있습니까? 가능하게하는 설정이 있습니까?

백그라운드 컴파일러가 충분히 잘 처리하는 것처럼 보이지만 (내가 같은 이름의 동일한 네임 스페이스에 2 개의 클래스가 있었고 불평하지 않았다는 사실을 제외하고는) 시도했지만 인텔리 센스가 제대로 작동하지 않습니다.

VB에서 C #으로 변환하려고했지만 모든 코드 변환을 완료 하지 못했습니다 . 작성해야 할 새로운 코드가 있지만 실제로는 새로운 프로젝트를 만들고 싶지 않았습니다.


9
C #으로 변환을 마치면 VB에서 새 코드를 작성하는 이유는 무엇입니까?
Adam Robinson

우연히도 두 개의 서로 다른 프로젝트에서 부분 클래스를 사용하여 하이브리드 접근 방식을 해제 할 수 있다고 생각했지만 부분은 어셈블리로 확장 될 수 없으므로 작동하지 않습니다.
D. Lambert

Dang, 그게 내 다음 시도 일거야.
Wes P

1
내 게시물을 수정했습니다. 우리는 끝나지 않았습니다.
Wes P

10
VB 코드를 혼합해야하는 이유 중 하나는 고유 한 기능, 특히 LINQ to XML을 사용하는 경우 XML 기능을 사용하는 것입니다. 'root.Elements ( "Data")의'from element ''를 작성하는 대신 VB의 동적 XML 구문 인 'From element In root. <Data>'를 사용할 수 있습니다. XML 파일로 많은 작업을 할 때이 구문은 C #보다 훨씬 쉬울 수 있습니다
Marchy

답변:


128

아냐, 못해 어셈블리 / 프로젝트 (각 프로젝트는 일반적으로 하나의 어셈블리로 컴파일 됨)는 하나의 언어 여야합니다. 그러나 여러 어셈블리를 사용할 수 있으며 모두 MSIL로 컴파일되므로 각각 다른 언어로 코딩 할 수 있습니다.

VB.NET 프로젝트는 실제로 .vb 파일 만 컴파일하고 C # 프로젝트는 실제로 .cs 파일 만 컴파일하므로 제대로 컴파일되고 불평하지 않았습니다. 다른 것을 무시하고 있었으므로 오류가 발생하지 않았습니다.

편집 : C # 프로젝트에 .vb 파일을 추가하는 경우 솔루션 탐색기 패널에서 파일을 선택한 다음 속성 패널을 보면 빌드 작업이 '컴파일'이 아니라 '콘텐츠'라는 것을 알 수 있습니다. 간단한 텍스트 파일로 취급되며 컴파일 된 어셈블리에 이진 리소스로 포함되지도 않습니다.

편집 : asp.net 웹 사이트를 사용하면 C # 웹 사용자 컨트롤을 vb.net 웹 사이트에 추가 할 수 있습니다


1
사실 후에 두 어셈블리를 결합하는 방법이 있지만이 사용자의 문제를 해결하지는 못합니다.
Steven Sudit

사실이지만 언어를 혼합하는 목적으로 만 사용하지는 않습니다.
Joel B Fant

동일한 프로젝트에서 관리되는 C ++과 관리되지 않는 C ++을 혼합 할 수 있다고 생각합니다.
Callum Rogers

@C Rogers : 그 상황은 완전히 다른 동물입니다. 원하는 경우 동일한 소스 파일에서 관리되는 C ++와 관리되지 않는 C ++를 혼합 할 수 있습니다. 그러나 여전히 VB.NET과 C #을 혼합하는 것과 동일하지 않습니다.
Joel B Fant

3
@ DanHoward : 타 오세요. 동일한 프로젝트 내에서 언어를 혼합하고 일치시킬 수없는 것은 확실히 블록입니다!

32

글쎄, 실제로 몇 년 전에 같은 프로젝트 내에서 VB와 C # 웹 양식을 혼합하기로 결정한 동료로부터 프로젝트를 물려 받았습니다. 그것은 효과가 있었지만 유지 관리하는 것은 재미 있지 않습니다.

새 코드는 C # 클래스 여야하고 작동하도록하려면 web.config의 컴파일 부분에 하위 노드를 추가해야했습니다.

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

모든 VB 코드는 App_Code의 VB라는 하위 폴더에 들어가고 C # 코드는 CS 하위 폴더에 들어갑니다. 두 개의 .dll 파일이 생성됩니다. 작동하지만 코드는 "codeSubDirectories"에 나열된 것과 동일한 순서로 컴파일되므로 C # 및 VB 모두에서 사용되는 경우 인터페이스가 VB 폴더에 있어야합니다.

VB와 C # 컴파일러에 대한 참조가 모두 있습니다.

<system.codedom>
    <compilers>

이 프로젝트는 현재 프레임 워크 3.5로 업데이트되었으며 여전히 작동합니다 (그러나 유지 관리하는 재미는 없습니다.)


자세한 내용은 stackoverflow.com/questions/15711964/… 를 참조하십시오
John

20

동일한 프로젝트 내에서 vb와 c #을 혼합 할 수 없습니다. Visual Studio에서 프로젝트 파일은 .vbproj 또는 .csproj입니다. 솔루션 내에서 vb에는 1 개의 프로젝트가 있고 c #에는 1 개의 프로젝트가 있습니다.

이것에 따르면 App_Code 디렉토리의 웹 프로젝트에서 둘 다 사용할 수 있습니다.

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


3
프로젝트 파일이 어셈블리 파일을 생성 할 수있는 이유가 아니기 때문에 공감. 원하는 경우 명령 줄에서 컴파일러를 사용하여 원하는 경우 프로젝트 파일이없는 어셈블리를 컴파일 할 수 있습니다. 작동하지 않는 이유는 어셈블리가 하나의 컴파일러에서 (거의 항상) 하나의 컴파일 작업이기 때문입니다. 프로젝트 파일과 관련이 없습니다.
Tom W

8
공감. 사용자 관점에서 확장명이 다르다는 생각은 할 수없는 이야기입니다.
user4951

14

일부 사용자 지정 MSBuild 개발에서 가능할 수 있습니다. 제공된 .targets는 프로젝트를 단일 언어로 강제하지만,이를 막는 런타임 또는 툴링 제한은 없습니다.

VB 및 CS 컴파일러 모두 모듈로 출력 가능 CLR의 .obj 파일 버전 인 있습니다. 어셈블리 링커를 사용하면 VB 및 CS 코드에서 모듈을 가져와 단일 어셈블리를 생성 할 수 있습니다.

이것이 사소한 노력이 아니라고 생각할 수도 있습니다.


6
Thomas Freudenberg의 좋은 글이 여기 있습니다 .
Dave M

1
또 다른 예는 Junfeng Zhang의 Sample : Mixing Unmanaged C ++, C ++ / CLI 및 C # 코드 에서 찾을 수 있습니다 . Visual Studio 설치에서. \ VC \ bin \ vcvars32.bat를 처음 실행 한 후에 작동하게 할 수 있습니다. 이것은 실제로 서로 다른 언어를 혼합하는 것은 하나의 프로젝트가 아닌 하나의 어셈블리입니다.
R. Schreurs 2016 년

7

연습 : 웹 사이트 프로젝트에서 여러 프로그래밍 언어 사용 http://msdn.microsoft.com/en-us/library/ms366714.aspx

기본적으로 App_Code 폴더는 여러 프로그래밍 언어를 허용하지 않습니다. 그러나 웹 사이트 프로젝트에서 Visual Basic 및 C #과 같은 여러 프로그래밍 언어를 지원하도록 폴더 구조 및 구성 설정을 수정할 수 있습니다 . 이를 통해 ASP.NET은 각 언어마다 하나씩 여러 어셈블리를 만들 수 있습니다. 자세한 내용은 ASP.NET 웹 프로젝트의 공유 코드 폴더를 참조하십시오. 개발자는 일반적으로 독립적으로 작동하고 다른 프로그래밍 언어를 선호하는 여러 개발 팀을 지원하기 위해 웹 응용 프로그램에 여러 프로그래밍 언어를 포함합니다.


2

Visual Studio에서는이 기능을 지원하지 않지만 (Visual Studio 내에서가 아닌 일부 트릭을 수행하고 MSBuild가 두 가지를 컴파일하도록 할 수는 있지만) SharpDevelop 는 지원합니다. Visual Studio Professional 이상을 실행하는 한 동일한 솔루션으로 둘 다 가질 수 있으므로 Visual Studio를 계속 사용하려는 경우 가장 쉬운 솔루션은 VB 코드를 다른 프로젝트로 분리하여 액세스하는 것입니다.


1
ShartDevelop는 이것을 어떻게 지원합니까? 방금 시도했지만 컴파일되지 않았습니다. 특별한 조치가 필요합니까?
epitka

2

프로젝트를 마우스 오른쪽 단추로 클릭하십시오. Asp.Net 폴더 추가를 선택하십시오. 폴더에서 VBCodeFiles라는 이름의 폴더 두 개와 Web의 다른 CSCodeFiles를 만듭니다 .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>

C # 프로젝트 인 경우 directoryName = "CSCodeFiles"는 중복되고 VB.Net 프로젝트 인 경우 directoryName = "VBCodeFiles"는 중복됩니다.


2

가능합니다 .c # 및 vb.net 프로젝트를 단일 솔루션에 추가하십시오.

1 단계 : 파일-> 추가-> 기존 프로젝트

2 단계 : 프로젝트-> 참조 추가-> DLL 또는 이전에 추가 한 프로젝트의 exe.

step3 : vb.net 양식에서 U는 프로젝트의 C # 양식-> 가져 오기 네임 스페이스를 사용하려고합니다.


1

C # 컴파일러 (또는 VB 컴파일러)로 프로젝트를 컴파일하고 컴파일러의 잘못된 언어를 사용하지 않는 방법을 알 수 없습니다.

C # 코드를 VB 프로젝트와 별도의 프로젝트에 보관하십시오. 이러한 프로젝트를 동일한 솔루션에 포함시킬 수 있습니다.


1

언어 당 하나의 프로젝트가 필요합니다. 어셈블리를 병합 한 도구를 보았을 것입니다. 해당 도구를 찾으면 좋을 것입니다. 같은 클래스에서 두 언어를 모두 사용해야하는 경우 VB.net에서이 언어의 절반을 작성한 다음 VB.net 클래스를 상속하여 나머지를 C #으로 작성할 수 있습니다.


1

다른 모든 답변을 반향 할 위험이 있으므로 동일한 프로젝트에서 혼합 할 수 없습니다.

VB를 C #으로 변환을 마치면 VB에 새 코드를 작성하는 이유는 무엇입니까?


2
내 게시물에서 오류를 발견했기 때문에 :) 우리는 아직 변환을 완료하지 않았습니다.
Wes P

1

.net 2.0의 경우 작동합니다. 관련 언어 코드로 앱 코드의 하위 디렉토리를 만들면 동일한 프로젝트에서 모두 컴파일됩니다. 현재로서는 3.5에서 작동하는지 여부를 찾고 있습니다.


1

VB코드를 라이브러리로 컴파일하지 않는 이유는 무엇입니까? 코드 .dll에서 나중에 참조하십시오. 둘 다 컴파일 되고 dlls포함 된 관리 됩니다.MSILc#vb


2
레거시 VB.NET 코드에서 새로운 C # 코드를 참조해야하는 경우 완전히 채워져 있습니다. 또는 그 반대의 경우에도 어느 쪽이든 참고 용입니다.
Roman Starkov

0

다른 사람들이 말했듯이 두 프로젝트를 하나의 프로젝트에 넣을 수는 없습니다. 그러나 다른 언어로 프로젝트에 포함하려는 작은 C # 또는 VB 코드 조각 만있는 경우 자동 변환 도구가 있습니다 . 그들은 완벽하지는 않지만 대부분의 일을 꽤 잘합니다. 또한 SharpDevelop 에는 변환 유틸리티가 내장되어 있습니다.


있습니다. 나는 그것을 빨아 들여서 VB에서 필요한 것을 코딩하고 나중에 나머지 것들과 함께 변환 할 수 있었다.
Wes P

0

아니요, 같은 프로젝트에는 없지만 동일한 솔루션에서 사용할 수 있습니다. 코드가 CLS 규격인지 확인해야합니다. 즉, 다른 언어로는 이해할 수없는 기능 / 기능을 사용해서는 안됩니다. 예를 들어 VB는 서명되지 않은 정수를 이해하지 못합니다.


0

이 시나리오에서는 단일 솔루션의 단일 VB.NET 프로젝트 (Windows Desktop 애플리케이션)입니다. 그러나 VB.NET의 부호있는 / 부호없는 정수, XML 리터럴 및 문자열 기능과 같은 C # 기능을 활용하고자했습니다. 따라서 기능에 따라 런타임에 코드 파일을 작성하고 각각의 Rosalyn 컴파일러 (VB / CS)를 사용하여 DLL로 컴파일하고 현재 어셈블리에 동적으로로드합니다. 물론 우리는 동적 DLL의 연결 해제, 언로드, 다시로드, 이름 지정 등을 수행해야했으며 메모리 관리는 충돌을 피하기 위해 이름 지정을 위해 동적 GUID를 주로 사용했습니다. 앱 사용자가 데스크톱 앱에서 DB에 연결하고, SQL 쿼리를 작성하고, LINQ 연결로 변환하고, LINQ 쿼리를 작성하여 소스 코드를 동적으로 작성하고 DLL로 컴파일하고 현재 어셈블리에 연결할 수있는 곳에서 잘 작동합니다.


-1

예, 웹 사이트에서만 두 파일을 모두 추가 할 수 있습니다. 프로젝트가 웹 응용 프로그램 인 경우 다른 유형의 파일을 허용하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.