gpt4 book ai didi

Roslyn 编译有两个程序集?

转载 作者:行者123 更新时间:2023-12-04 04:59:04 30 4
gpt4 key购买 nike

我有一个带有两个输出 dll 的解决方案(实际上更多,但让我们保持简单)。项目“Special”引用项目“Common”。
我尝试编写一个代码生成器来解析“Special”中的一些文件,并将生成的 stub 代码放入“Common”项目中。为了处理这个循环引用,我需要处理无法编译的代码。所以我正在使用 Roslyn。
生成器需要根据继承信息替换一些类型,所以我需要构造一个编译单元来访问语义模型。此外,我需要根据类型的来源替换一些东西(无论它们是在“特殊”还是“通用”中定义。或更准确地说:基于全局程序集属性)。
生成器必须能够作为 MSBuild 任务运行。
我尝试了两种方法来设置我的环境,但我都坚持使用:

  • 我试图在生成器中加载我的解决方案。这失败是因为“无法将透明代理转换为类型‘Roslyn.Utilities.SerializableDataStorage’”。然后我尝试从头开始创建解决方案,添加 IProjects 和 IDocuments,并且我已经按照 this answer 中的建议尝试了 LoadProjectFromCommandLineArguments ,但似乎没有什么对我有用,而且我在从 MSBuild 运行时遇到了同样的异常(通过控制台启动时它运行良好)。
    任何人都知道如何处理 SerializableDataStorage 异常?
  • 我试图创建一个编译并添加我所有的 cs 源。但是现在我找不到一种方法来知道我的符号是来自程序集“Special”还是“Common”。
    我可以使用一个 Compilation 编译成两个不同的程序集吗?或者我可以将一个编译作为对另一个编译的引用传递吗? (是否有一个 MetadataReference 我可以提供给 Compilation.AddReference 指向另一个 Compilation?)

  • PS:我还没有尝试过的是在将语法树添加到 Compilation 或使用 SyntaxTree.FilePath 属性和一些映射之前,将某种元数据(例如开头的注释节点)添加到语法树中,以使用它我的生成器中的信息来判断定义的类型是来自“特殊”还是“通用”。我宁愿最终不会做这样的事情,因为它会很快变得困惑(实际上,我有大约 20 个 dll)。

    最佳答案

    因此,编译和构建的程序集之间存在 1:1 的对应关系,因此如果您需要在分析期间表示这两个程序集,则需要进行两次编译。要在它们之间添加引用,只需执行 compilation.AddReference(new CompilationReference(sourceCompilation))和符号应该以您期望的方式导入。不要忘记编译是不可变的,所以如果你 fork sourceCompilation 你可能也需要 fork 你的引用编译。

    在任何给定的符号上,都有一个属性 ContainingAssembly 可以让您返回到符号来自的程序集。确保您在编辑中正确设置了输出名称,这样您就可以弄清楚这一点。

    关于Roslyn 编译有两个程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16365139/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com