2011-12-19 11 views
5

私はプロジェクトに取り組んできましたが、成長しているので、一緒に結合できない2つの部分が相互依存していることに気付きました。csc.exeと相互依存アセンブリ

これらの2つの部分をa.exeとb.dllとしましょう。 b.dllはa.exeがデータを取得できるようにする実装を提供しますが、別のデータソースと通信するために簡単に変更できるように、独自のスタンドアロンアセンブリにします。

しかし、b.dllを参照するにはa.exeが必要ですが、b.dllにはa.exeの不可分な部分であるいくつかの関数が必要です。

私はこのプロジェクトを書いているので、テストするためにa.exeとb.dllの両方が存在し、a.dllとa.exeに対してb.dllをコンパイルできますb.dllに対して、どのようにしてソースからこれらの両方を再構築できますか?

+0

どのようにVisual Studioから循環依存エラーが発生していませんか? – Oded

+0

@Oded彼はコマンドラインのコンパイルを使用しています。これを繰り返し作成して循環依存を作成することはできますが、非常に難しいことはありません。 –

+0

@ReedCopsey - 彼はそれをやっているかもしれないと思ったが、OPからの確認が欲しかった。あなたが言ったように、このシナリオではきれいなビルドは不可能です。 – Oded

答えて

2

起動csc.exeを参照する必要が共通個/部品を含むべきである - それはC.DLL

  • C.DLLを参照しますa.exeに、csc.exe、coを起動しますb.dllのソースをb.dllにコピーしてa.exeを参照し、最後にcsc.exeを起動し、a.exeのソースをa.exeにコンパイルしてb.dllを参照します。

  • 4

    一般に、これをリファクタリングして、共有依存関係を独自のアセンブリ(c.dll)に移動することをお勧めします。この方法では、a.exeとb.dllの両方がc.dllを参照する可能性があり、この循環依存関係を避けることができます。

    +0

    私はそれをやった場合、この状況では、私は想像することができますそのc.dllはa.exeとb.dllに依存します。 機能がb.dllおよびa.exeのコードと適切に分離できません。 –

    +1

    @RobertAllanHenniganLeahyあなたの目標はこれを分離することです。デカップリングするようにAPIを設計してみてください。タイプがすべて相互に依存する必要はありません。 a.exeやb.dllが機能を提供するために実装する、あるいはデリゲートなどを使用するためのインターフェイスを、常にc.dllに定義することができます。このような循環依存関係は、常に回避できます。 –

    +0

    私はそれを避けるためだけに依存関係を避ける必要があります。特に、提案する方法が複雑さとサイズを増やし、パフォーマンスを低下させる可能性がある場合には特にそうです。私はこの問題を回避する簡単な方法を考えました - cscを呼び出します。exe、a.exeとb.dllのソースをa.exeにコンパイルし、csc.exeを呼び出し、b.dllのソースをb.dllにコンパイルしてa.exeを参照してから、csc.exeを最後に呼び出します。 a.exeのソースをa.exeにコンパイルし、b.dllを参照します。 –

    5

    私は3つのアセンブリにあなたのシステムをリファクタリングします:

    • A.EXE - メインEXEの何がこの
    • B.DLLを参照するべきではありません - あなたは今日それを持っていますが、A.EXE参照していませんので、これはA.EXEとB.DLLのソースをコンパイルし、AとBの両方が
    +0

    b.dllには1つのクラスしか含まれていません - DataSourceと呼びましょう - a.exeにはクラスのライブラリが含まれていますが、b.dllに必要なクラスはa.exeの主要コンポーネントであるServerというクラスです。 –

    関連する問題