質問

主にVBで書かれたプロジェクトを継承しました。できる限りゆっくりとC#に変換しながら、VBに持っているものを維持したいと思います。これを行う唯一の方法は、個別のC#プロジェクトを作成することです。ただし、これにより、依存関係と参照のために問題が発生します。持っていない VBProject 参照 CSharpProject また、循環参照を作成するため、逆も同様です。これは、他のプロジェクトを参照できるようにするために両方のプロジェクトが必要なため、問題です。これを行うためのより良い方法はありますか、それともVBで書いたのですか(またはC#に完全に翻訳)?

また、これらのプロジェクトは同じソリューションにあります。参照を作成せずに、または他のより簡単な方法を作成せずにインポート/使用できてはいけませんか?

役に立ちましたか?

解決

円形の参照を削除する必要はありません。

私が過去に言語Aから言語Bに変換した同様の状況に直面したとき、私は言語Aコードのビットをリファクタリングして、コードベースの大部分とは独立しているように始めました。次に、これらの孤立したピースを言語Bに翻訳し、メインプログラムが新しいモジュールに依存するように統合します。最終的に、残っていたのはメインプログラムでした。

時間がかかりましたが、このボトムアップアプローチは非常に効果的で、私ははるかにモジュール式プログラムになりました。

他のヒント

コントロールの反転は、このような移行を行うのに大いに役立ちます。私は最近、テストされていないダクトテープVB.NETコードに重要な機能を追加するように求められたときに同様の問題に取り組みました。 VB.NETから既存の影響を受ける機能を抽出し、それをユニットテストC#アセンブリに入れたかったのです。

クラスを新しいアセンブリに抽出したいが、元のアセンブリに戻って依存関係につながる場合、元のアセンブリからの依存関係によって実装される新しいアセンブリの契約インターフェイスを定義することでこれを無効にすることができます。

たとえば、AlphaがBravoに言及しているVB.NETアセンブリのクラスAlpha、Bravo、およびCharlieが与えられています。 Bravoを抽出したいのですが、チャーリーへの言及があります。ブラボーが気にかけているチャーリーのメンバーを含むC#プロジェクトで、Icharlieというインターフェイスを定義します。 VB.NETプロジェクトでは、Charlie:Icharlieを変更します。 Bravoを構築すると、タイプIcharlieの依存性を受け入れます。

このアプローチの利点は、同じプロジェクトや一連のプロジェクト内であっても、テスト責任です。クラス間の依存関係はよく知られており、模擬/スタブで置き換えることができるため、Bravoのようなクラスは、実際のIcharlieの実装でセットアップすることを心配する必要なくテストできます。

C#プロジェクトがVBプロジェクトに依存している間、これを行うことはできません。

クラス/関数が独立しており、VBプロジェクトに依存しないように、VB.NETプロジェクトからクラスをC#プロジェクトに抽出する必要があります。

これは私が毎日職場で戦うことであり、私はゆっくりと光に向かって動いています(C#)

特定のアイテムを新しいC#プロジェクトに抽出して参照することができない場合は、すべてを書き直す必要があります。 WebアプリケーションプロジェクトまたはWindowsフォームプロジェクトの場合、同じプロジェクトでどのようなハイブリッドを維持することはできません。 Webサイトプロジェクトがある場合は、個々のページごとにハイブリッドを使用できる言語を指定できます。しかし、これは非常に厄介であり、C#ですべてを書き直すか、VBでの執筆に適応する時間を割り当てる方がはるかに良いと思うでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top