同じプロジェクトでのC#とVBの混在


145

クラスライブラリの同じプロジェクトでvbファイルとc#ファイルを混在させることはできますか?それを可能にする設定はありますか?

私が試してみましたが、バックグラウンドコンパイラはそれを十分に処理しているようですが、(同じ名前の同じ名前空間に2つのクラスがあり、不満がなかったという事実を除いて)、どのIntelliSenseも完全に正しく機能しません。

VBからC#に変換しようとしていますが、すべてのコードの変換完了していません。作成する必要がある新しいコードがいくつかありますが、それだけのために新しいプロジェクトを作成したくありませんでした。


9
C#への変換が完了したばかりなのに、なぜVBで新しいコードを書くのですか?
アダムロビンソン

ちなみに、2つの異なるプロジェクトでパーシャルクラスを使用してハイブリッドアプローチを実現することは可能かもしれないと思いましたが、パーシャルはアセンブリにまたがることができないため、これも機能しません。
D.ランバート

ダン、それは私の次の試みでした。
Wes P

1
私の投稿を修正しました。まだ終わっていません。
ウェスピー

10
VBコードを混在させる理由の1つは、その独自の機能、特にLINQ to XMLを使用している場合は特にXML機能を使用することです。そうすれば、「from element in root.Elements( "Data")」と書く代わりに、VBの動的XML構文「From element In root。<Data>」を使用できます。XMLファイルで多くの作業を行う場合、この構文はC#よりもはるかに簡単に操作できます
Marchy

回答:


128

いいえ、できません。アセンブリ/プロジェクト(通常、各プロジェクトは1つのアセンブリにコンパイルされます)は1つの言語である必要があります。ただし、複数のアセンブリを使用でき、それらはすべてMSILにコンパイルされるため、それぞれを異なる言語でコーディングできます。

VB.NETプロジェクトは実際には.vbファイルのみをコンパイルし、C#プロジェクトは実際には.csファイルのみをコンパイルするため、問題なくコンパイルされ、不満はありませんでした。他のものを無視していたため、エラーは発生しませんでした。

編集: C#プロジェクトに.vbファイルを追加し、ソリューションエクスプローラーパネルでファイルを選択してから、プロパティパネルを見ると、ビルドアクションが「コンパイル」ではなく「コンテンツ」であることがわかります。単純なテキストファイルとして扱われ、コンパイルされたアセンブリにバイナリリソースとして埋め込まれることもありません。

編集: asp.net Webサイトを使用すると、C#Webユーザーコントロールをvb.net Webサイトに追加できます


1
事後に2つのアセンブリを組み合わせる方法はありますが、それではこのユーザーの問題を解決できません。
Steven Sudit、2009

確かに、しかし私は言語を混ぜ合わせるという唯一の目的のためにそれを容認しないでしょう。
ジョエルBファント

同じプロジェクトでマネージドc ++とアンマネージドc ++を混在させることができると思います。
Callum Rogers、

@Cロジャース:その状況はまったく別の生き物です。必要に応じて、マネージC ++とアンマネージC ++を同じソースファイルに混在させることができます。ただし、VB.NETとC#を混在させることとは異なります。
ジョエルBファント

3
@DanHoward:痛い、燃える。これは間違いなくブロックであり、同じプロジェクト内で言語を混合して一致させることはできません!

32

実際、私は数年前に、同じプロジェクト内でVBとC#のWebフォームを混在させることにした同僚からプロジェクトを継承しました。それはうまくいきましたが、維持するのは面白くありません。

新しいコードはC#クラスにする必要があると判断し、それらを機能させるには、web.configのコンパイル部分にサブノードを追加する必要がありました。

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

すべてのVBコードは、VBと呼ばれるApp_Codeのサブフォルダーに入れられ、C#コードはCSサブフォルダーに入れられます。これにより、2つの.dllファイルが生成されます。機能しますが、コードは「codeSubDirectories」にリストされているのと同じ順序でコンパイルされるため、C#とVBの両方で使用する場合、インターフェイスはVBフォルダーにある必要があります。

私はVBとC#コンパイラへの参照の両方を持っています

<system.codedom>
    <compilers>

プロジェクトは現在フレームワーク3.5に更新されており、引き続き機能します(ただし、メンテナンスするのは面白くありません。)


詳細については、stackoverflow.com / questions / 15711964 /…を参照してください
John

20

同じプロジェクト内でvbとc#を混在させることはできません。ビジュアルスタジオでプロジェクトファイルが.vbprojまたは.csprojであることに気付いた場合。ソリューション内で行うことができます-vbに1つのプロジェクト、c#に1つのプロジェクトがあります。

これによると、App_CodeディレクトリのWebプロジェクトで両方を使用できる可能性があります。

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


3
プロジェクトファイルはそれらからアセンブリを作成できない理由ではないため、反対票を投じます。コマンドラインからコンパイラを使用して、必要に応じて、プロジェクトファイルが存在していなくてもアセンブリをコンパイルできます。これが機能しない理由は、アセンブリが(ほとんどの場合)1つのコンパイラからの1つのコンパイルジョブであるためです。プロジェクトファイルとは関係ありません。
トムW

8
賛成票。ユーザーの観点から見ると、拡張機能が異なるという考えは、あなたが/できないという明白な兆候です。
user4951 2012

14

一部のカスタムMSBuild開発で可能になる場合があります。提供された.targetsは、プロジェクトを単一言語にすることを強制しますが、これを防ぐランタイムまたはツールの制限はありません。

VBコンパイラとCSコンパイラの両方がモジュールに出力できます(CLRのバージョンの.objファイル)にます。アセンブリリンカーを使用して、VBおよびCSコードからモジュールを取得し、単一のアセンブリを作成できます。

これは簡単なことではありませんが、おそらくうまくいくでしょう。


6
これについては、Thomas Freudenbergによる優れた記事があります
Dave M

1
の別の例は、Junfeng Zhangによる「サンプル:アンマネージC ++、C ++ / CLI、およびC#コードの混合」にあります。Visual Studioのインストールから。\ VC \ bin \ vcvars32.batを最初に実行した後、動作する可能性があります。これは実際には、異なる言語を混合することは、1つのプロジェクトではなく1つのアセンブリです。
R. Schreurs 2015年

7

チュートリアル:Webサイトプロジェクトでの複数のプログラミング言語の使用 http://msdn.microsoft.com/en-us/library/ms366714.aspx

デフォルトでは、App_Codeフォルダーは複数のプログラミング言語を許可しません。ただし、Webサイトプロジェクトでは、フォルダー構造と構成設定を変更して、Visual BasicやC#などの複数のプログラミング言語をサポートできます。これにより、ASP.NETは、言語ごとに1つずつ、複数のアセンブリを作成できます。詳細については、「ASP.NET Webプロジェクトの共有コードフォルダー」を参照してください。開発者は通常、Webアプリケーションに複数のプログラミング言語を組み込んで、独立して動作し、異なるプログラミング言語を好む複数の開発チームをサポートします。


2

Visual Studioはこれをサポートしていません(いくつかのトリックを実行してMSBuildで両方をコンパイルできますが、Visual Studio内からはできません)。SharpDevelopはサポートしています。両方を同じソリューションに含めることができます(Visual Studio Professional以上を実行している限り)。そのため、Visual Studioを使い続けたい場合の最も簡単なソリューションは、VBコードを別のプロジェクトに分離し、それにアクセスすることです。


1
ShartDevelopはこれをどのようにサポートしていますか?私はそれを試してみましたが、コンパイルされません。何か特別なことをする必要がありますか?
epitka 2009

2

プロジェクトを右クリックします。Add Asp.Net Folderを選択します。The Folderの下で、VBCodeFilesという名前の2つのフォルダーを作成し、Web.Configにその他のCSCodeFilesを作成して、コンパイル中に新しい要素を追加します。

<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つのソリューションに追加します。

ステップ1:ファイル->追加->既存のプロジェクト

ステップ2:プロジェクト->参照の追加->以前に追加したプロジェクトのdllまたはexe。

ステップ3:プロジェクトのc#フォーム->インポート名前空間を使用するvb.netフォーム。


1

C#コンパイラー(またはVBコンパイラー)を使用してプロジェクトをコンパイルする方法がわからないので、コンパイラーの間違った言語でプロジェクトを実行しないでください。

C#コードをVBプロジェクトとは別のプロジェクトに保存します。これらのプロジェクトを同じソリューションに含めることができます。


1

言語ごとに1つのプロジェクトが必要です。アセンブリをマージするツールを見たと私は確信しています。同じクラスで両方の言語を使用する必要がある場合は、その半分をVB.netなどで記述し、VB.netクラスを継承することで残りをC#で記述できるはずです。


1

他のすべての回答をエコーするリスクがありますが、同じプロジェクトでそれらを混在させることはできません。

それはさておき、VBをC#に変換し終えたばかりなら、なぜVBで新しいコードを書くのでしょうか?


2
私の投稿でエラーを見つけたからです:)まだ変換が完了していません。
ウェスP

1

.net 2.0の場合、これは機能します。関連する言語コードを使用してアプリ内コードのサブディレクトリを作成すると、同じプロジェクトで両方がコンパイルされます。現時点では、これが3.5で機能するかどうかを探しています。


1

単にVBコードをライブラリー(.dll)にコンパイルしないでください。後でコードから参照してください。マネージドはdlls含まれてMSILどちらにc#してvbコンパイルされています。


2
レガシーVB.NETコードから新しいC#コードを参照する必要がある場合は、完全に詰め込まれます。またはその逆、どちらに行っても、それは一方向の参照のみです。
Roman Starkov 2016年

0

他の人が言ったように、1つのプロジェクトに両方を入れることはできません。ただし、他の言語のプロジェクトに含めたいC#またはVBコードの小さな部分がある場合は、自動変換ツールがあります。彼らは完璧ではありませんが、ほとんどのことをかなりうまく行っています。また、SharpDevelopには変換ユーティリティが組み込まれています。


それがあります。私はそれを吸い上げて、VBで必要なものをコーディングし、残りの部分で後で変換することができます。
ウェスP

0

いいえ、同じプロジェクトではありませんが、同じソリューションで使用できます。ただし、コードがCLSに準拠していることに注意する必要があります。つまり、他の言語では理解できないような機能を使用してはなりません。たとえば、VBはunsigned intを理解しません。


0

このシナリオでは、単一のソリューション内の単一のVB.NETプロジェクト(Windowsデスクトップアプリケーション)です。ただし、VB.NETの符号付き/符号なし整数、XMLリテラル、文字列機能などのC#機能を利用したいと考えました。したがって、機能に応じて、実行時にコードファイルをビルドし、それぞれのRosalynコンパイラ(VB / CS)を使用してDLLにコンパイルし、現在のアセンブリに動的にロードします。もちろん、ダイナミックDLLのリンク解除、アンロード、リロード、ネーミングなどに取り組む必要があり、競合を回避するためにネーミングにダイナミックGUIDを主に使用してメモリ管理を行いました。アプリユーザーがデスクトップアプリから任意のDBに接続し、SQLクエリを記述し、接続をLINQ接続に変換し、ソースコードの動的なビルド、DLLへのコンパイル、現在のアセンブリへのアタッチを必要とするLINQクエリも記述できる場合、問題なく機能します。


-1

はい、両方のファイルをWebサイトにのみ追加できます。プロジェクトがWebアプリケーションの場合、異なるタイプのファイルは許可されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.