2 つの出力 dll を使用したソリューションがあります (実際にはそれ以上ですが、シンプルに保ちます)。プロジェクト「スペシャル」は、プロジェクト「コモン」を参照します。
「Special」からいくつかのファイルを解析し、生成されたスタブ コードをプロジェクト「Common」に配置するコード ジェネレーターを作成しようとしています。この循環参照に対処するには、コンパイルしないコードに取り組む必要があります。だから私はRoslynを使っています。
ジェネレーターは、継承情報に基づいていくつかの型を置き換える必要があるため、セマンティック モデルにアクセスするためのコンパイル ユニットを作成する必要があります。さらに、型の起源に基づいていくつかのものを置き換える必要があります (「特別」または「共通」で定義されているかどうか。より正確には、グローバル アセンブリ属性に基づいています)。
ジェネレーターは、MSBuild タスクとして実行できる必要があります。
環境をセットアップするために 2 つの方法を試しましたが、どちらにも行き詰っています。
Generator 内に自分のソリューションをロードしようとしました。これは、「タイプ 'Roslyn.Utilities.SerializableDataStorage' に透過プロキシをキャストできません」という理由で失敗します。次に、IProjects と IDocuments を追加してソリューションを最初から作成しようとしましたが、この回答で提案されているように LoadProjectFromCommandLineArguments を既に試しましたが、何もうまくいかないようで、MSBuild から実行するとまったく同じ例外が発生します (経由で開始すると正常に実行されます)。コンソール)。
SerializableDataStorage 例外の処理方法を知っている人はいますか?
コンパイルを作成して、すべての cs ソースを追加しようとしました。しかし、シンボルがアセンブリ "Special" または "Common" のどちらから来たのかを知る方法が見つかりません。
1 つのコンパイルを使用して 2 つの異なるアセンブリにコンパイルできますか? または、あるコンパイルを別のコンパイルへの参照として渡すことはできますか? (別の Compilation を指す Compilation.AddReference にフィードできる MetadataReference はありますか?)
PS: まだ試していないことは、コンパイルに追加する前にある種のメタデータ (最初のコメント ノードなど) を構文ツリーに追加するか、SyntaxTree.FilePath プロパティといくつかのマッピングを使用して、これを使用することです。定義されたタイプが「特別」または「共通」のどちらからのものかを伝えるジェネレーターの情報。私はむしろ、このようなことをすることにはなりたくありません.