2

2 つの出力 dll を使用したソリューションがあります (実際にはそれ以上ですが、シンプルに保ちます)。プロジェクト「スペシャル」は、プロジェクト「コモン」を参照します。

「Special」からいくつかのファイルを解析し、生成されたスタブ コードをプロジェクト「Common」に配置するコード ジェネレーターを作成しようとしています。この循環参照に対処するには、コンパイルしないコードに取り組む必要があります。だから私はRoslynを使っています。

ジェネレーターは、継承情報に基づいていくつかの型を置き換える必要があるため、セマンティック モデルにアクセスするためのコンパイル ユニットを作成する必要があります。さらに、型の起源に基づいていくつかのものを置き換える必要があります (「特別」または「共通」で定義されているかどうか。より正確には、グローバル アセンブリ属性に基づいています)。

ジェネレーターは、MSBuild タスクとして実行できる必要があります。

環境をセットアップするために 2 つの方法を試しましたが、どちらにも行き詰っています。

  1. Generator 内に自分のソリューションをロードしようとしました。これは、「タイプ 'Roslyn.Utilities.SerializableDataStorage' に透過プロキシをキャストできません」という理由で失敗します。次に、IProjects と IDocuments を追加してソリューションを最初から作成しようとしましたが、この回答で提案されているように LoadProjectFromCommandLineArguments を既に試しましたが、何もうまくいかないようで、MSBuild から実行するとまったく同じ例外が発生します (経由で開始すると正常に実行されます)。コンソール)。

    SerializableDataStorage 例外の処理方法を知っている人はいますか?

  2. コンパイルを作成して、すべての cs ソースを追加しようとしました。しかし、シンボルがアセンブリ "Special" または "Common" のどちらから来たのかを知る方法が見つかりません。

    1 つのコンパイルを使用して 2 つの異なるアセンブリにコンパイルできますか? または、あるコンパイルを別のコンパイルへの参照として渡すことはできますか? (別の Compilation を指す Compilation.AddReference にフィードできる MetadataReference はありますか?)

PS: まだ試していないことは、コンパイルに追加する前にある種のメタデータ (最初のコメント ノードなど) を構文ツリーに追加するか、SyntaxTree.FilePath プロパティといくつかのマッピングを使用して、これを使用することです。定義されたタイプが「特別」または「共通」のどちらからのものかを伝えるジェネレーターの情報。私はむしろ、このようなことをすることにはなりたくありません.

4

1 に答える 1

3

したがって、コンパイルとビルドされたアセンブリの間には 1:1 の対応があるため、分析中に両方のアセンブリを表す必要がある場合は、2 つのコンパイルが必要になります。それらの間に参照を追加するには、実行するだけでcompilation.AddReference(new CompilationReference(sourceCompilation))、シンボルは期待どおりにインポートされます。コンパイルは不変であることを忘れないでください。したがって、sourceCompilation をフォークする場合は、参照コンパイルもフォークする必要がある場合があります。

任意のシンボルには、シンボルの元のアセンブリに戻るプロパティ ContainingAssembly があります。コンパイル時に出力名を正しく設定していることを確認してください。そうすれば、それを理解できるようになります。

于 2013-05-03T21:34:24.413 に答える