16

これはおそらくばかげた質問のように聞こえますが、とにかくそれを試してみるつもりです。

したがって、Visual Studioでは、XがYを参照し、YがXを参照するように2つのプロジェクトXとYを作成することはできません。

一般に、さまざまな理由から、循環依存が問題になる可能性があることを完全に理解できます。

しかし、このように相互依存している2つのプロジェクトをコンパイルすることは本当に不可能ですか?(私の考えでは、これについては完全にオフベースであるかもしれませんが)2つの相互に依存するアセンブリを持つことは、2つの相互に依存するクラスを持つことと実際にはそれほど違いがないため、可能である必要があるように思われます。合法であり、コンパイルすることができます。

「コンパイラが一方を他方の前にコンパイルできなかったため、2つのアセンブリが相互に依存することはできません」と言った場合、私には意味があります。ただし、同じアセンブリ内の2つのクラスに対して同じ引数を指定できるようであり、コンパイラはこのシナリオを問題なく処理できることは明らかです。

基本的に私が尋ねている理由は、私がこのことをしたいという切実な願望を持っているということではありません。具体的には、基本的に1つのユニットの相互に依存する2つの部分として存在し、特定の部分がC#で記述されているために分離されている、MyProjectCSとMyProjectVBの2つのプロジェクトがあればいいのではないかと思います。他の部分はVB.NETで書かれています。

だから、私の質問は(yikes、3倍)です:

  1. この動作を有効にすることは可能ですか(Visual Studio、またはその他の場所で)?
  2. IDE内でそれが不可能な場合、少なくとも理論的には可能ですか、それとも相互に依存するアセンブリが存在しない可能性がありますか?
  3. 理論的にも不可能な場合は、どうしてですか?言い換えると、相互に依存するアセンブリは、単一のアセンブリ内の相互に依存するコードとどのように異なりますか?
4

5 に答える 5

12

IDEでそれを行う方法がわかりません。ただし、複雑なビルドプロセスを介して構築することは可能です。

必要になるだろう:

  1. アセンブリA
  2. アセンブリB
  3. スタブアセンブリB

ここで、スタブアセンブリBには、アセンブリBのパブリッククラスとパブリックメソッド、および同じAssemblyInfo。*が含まれ、同じ公開キーを参照します。

ビルド順序:

  1. スタブアセンブリBをコンパイルします
  2. スタブアセンブリBをアセンブリBの出力ディレクトリにコピーします
  3. アセンブリAを構築する
  4. アセンブリBを構築する

メソッドシグニチャに型の直接ループ参照を含めることはできないことに注意してください。ただし、オブジェクトをキャストすることで効果的なループを作成できます。

ノート:

ilasmは、コンパイル時に存在しない型を何らかの方法で解決できるため、真の相互再帰アセンブリをコンパイルできます。

さらに遠く:

aspnet_compilerは、同じプロジェクトで異なる言語を混在させることができるようです(誰がその方法を知っていますか)。

于 2010-07-03T01:26:27.163 に答える
6

mscorlib.dllアセンブリとSystem.dllアセンブリは相互に依存していますが、2つのアセンブリを相互に依存させないことをお勧めします。

名前空間のようなヒンジ間の依存関係サイクルに関しては、依存関係サイクルを検出して回避するためにNDependを使用することをお勧めします。

代替テキスト

記事からの抜粋(私が書いた):クリーンなアーキテクチャを取得するためのコンポーネントの依存関係の制御

コンポーネント間の依存サイクルは、一般にスパゲッティコードまたはもつれたコードと呼ばれるものにつながります。コンポーネントAがAに依存するCに依存するBに依存する場合、コンポーネントAはBとCから独立して開発およびテストすることはできません。A、B、およびCは、一種のスーパーコンポーネントである分割できないユニットを形成します。このスーパーコンポーネントは、スケール現象の不経済性のために、A、B、およびCのコストの合計よりもコストが高くなります(ソフトウェア推定:スティーブマコネルによるブラックアートの謎を解くに詳しく説明されています)。基本的に、これは、分割できないコードを開発するコストが指数関数的に増加することを意味します。

これは、1,000 LOC(Lines Of Code)の開発と維持には、それぞれ500 LOCの2つの独立した塊に分割できない限り、500LOCの開発と維持の3〜4倍のコストがかかる可能性があることを示しています。したがって、維持できないもつれたコードを記述するスパゲッティとの比較。アーキテクチャを合理化するには、コンポーネント間に依存関係のサイクルがないことを確認する必要がありますが、各コンポーネントのサイズが許容範囲内(500〜1000 LOC)であることも確認する必要があります。

于 2010-08-29T19:13:38.577 に答える
2

VBでどのように機能するかはわかりませんが、理論的には、一方をコンパイルするためにもう一方を指す(不正なコードを生成する)ある種のプレースホルダーを使用し、それを使用してもう一方をコンパイルしてから再コンパイルすることは可能です。最初。

これが、たとえば、相互に必要なプログラムをコンパイルするときに循環依存関係の解決が機能する方法です。

-通常、これはまだ存在しない機能を無効にすることで行われます。

于 2010-07-03T01:25:29.600 に答える
1

コマンドラインツールを使用してビルドする場合は、多くのモジュールを含むアセンブリを作成できます。各モジュールは、異なるコンパイラでコンパイルできます。モジュールは、モジュール間に循環依存関係を持つことができます。

しかし、私は視覚的なスタジオがこれをサポートすることを期待していません。


ある型の要求をあるアセンブリから別のアセンブリにリダイレクトするようにリンカに指示するために実行できるトリックもあります。Microsoftはこれらを使用してから、.netFramework内で型を移動します。これは、すべての呼び出し元にコードを再コンパイルさせることができない場合にのみ価値があります。

于 2010-10-19T13:28:28.043 に答える
0

条件付きコンパイルを使用する場合、VisualStudioで循環依存関係を持つことができます。ほとんどの場合、最初に循環参照を削除するのが最善ですが、循環参照を保持する正当な理由がある場合は、このソリューションを回避策として使用して、循環参照を構築することができます。

于 2015-12-03T21:32:16.923 に答える