2010-12-20 12 views
1

私はVBで書かれたプロジェクトを継承しました。私はできるだけ早くC#に変換しながら私はVBで持っているものを維持したいと思います。私がこれを行うために見つけた唯一の方法は、別のC#プロジェクトを作成することです。しかし、これは依存関係と参照のために問題を引き起こします。 VBProject参照CSharpProjectを持つことはできません。逆の場合は、循環参照が作成されるためです。これは問題です。なぜなら、私はもう一方のプロジェクトを参照するためには両方のプロジェクトが必要だからです。これを行うには良い方法がありますか、VBで書かれている(またはC#に完全に翻訳していますか?)プロジェクトを分割するVB/C#と参照先

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

答えて

3

循環参照を削除する必要はありません。

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

このボトムアップのアプローチは非常に効果的で、モジュール化されたプログラムが完成しました。

1

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

VB.netプロジェクトからクラスを抽出して、クラス/関数がスタンドアローンでVBプロジェクトに依存しないようにする必要があります。あなたが参照するために、新しいC#プロジェクトに特定の項目を抽出することができない場合、あなた」(C#の)

1

この

は私が仕事の毎日でに対して戦うものだ、と私はゆっくりと光に向かって移動していますすべてを書き直す必要があります。 WebアプリケーションプロジェクトまたはWindowsフォームプロジェクトの場合は、同じプロジェクト内でどのような種類のハイブリッドも維持することはできません。ウェブサイトプロジェクトをお持ちの場合は、個々のページの言語を指定してハイブリッドを作成することができます。これは非常に乱雑ですが、C#ですべてを書き直したり、VBで書くのに時間を割いたほうがはるかに優れています。

2

Inversion of Controlは、このような移行を大幅に進めるのに役立ちます。私は最近、テストされていないダクトテープVB.Netコードに重要な機能を追加するように求められたときも同様の問題に取り組んだ。 VB.Netから既存の影響を受けた機能を抽出し、単体テストのC#アセンブリに組み込みたいと思っていました。

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

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

このアプローチの利点は、同じプロジェクトまたは一連のプロジェクト内であっても、テスト容易性です。クラス間の依存関係はよく知られており、実際のICharlie実装での設定を心配することなくBravoなどのクラスをテストできるように、モック/スタブで置き換えることができます。

+0

しかし、VBプロジェクトは、C#プロジェクトにある場合、ICharlieについてどのように知っていますか? – Jason

+0

VB.NetプロジェクトにはC#プロジェクトへの参照があるためです。または、C#プロジェクトにVB.Netプロジェクトへの参照が必要な場合は、Bravo(C#)が実装するVB.Netプロジェクト内でIBravoインターフェイスを定義します。一般的に私はそれを逆にしています。 C#アセンブリの依存関係のために定義されたインターフェイスが半ダース以上あるかもしれませんが、既存のVBコード内で行う必要がある唯一の変更は、既存のパブリックメソッドを公開するためにインターフェイスを継承することです。 –

関連する問題