【问题标题】:.NET CompileAssemblyFromSource: Determine which source failed?.NET CompileAssemblyFromSource:确定哪个源失败?
【发布时间】:2011-12-07 22:36:05
【问题描述】:

我正在动态编译代码,使用带有多个源的CompileAssemblyFromSource

如果出现编译错误,我可以从 Errors 集合中检索行号等。

但是行号是所有源中的行号。我需要的是失败源中的哪个源和行号(在添加的源中)。

不做计算杂技可以吗?

【问题讨论】:

  • 我会考虑改用CompileAssemblyFromFile(至少作为调试或详细选项),这使您能够在事后查看源代码并了解发生了什么。如果您使用临时文件,您可以随时清理...
  • @Paul 那应该是一个答案!
  • @Paul:写到一个我不能使用的临时文件,我害怕。在我的解决方案(存在特定问题)中,来源是从许多单独的来源(甚至来自最终用户)收集的,我只需要查看有问题的实际来源。
  • 行号是来自单个来源,还是来自所有来源附加在一起?即,如果您返回第 5 行,则它可能是任何源中的第 5 行。
  • @Henrik:您是否处于无法编写临时文件的环境中?我从您的回复中猜测您的调试/详细解决方案不合适,因为您知道在生产场景中可能会出错(来自最终用户数据的代码几乎可以保证这一点!)。临时文件方法可能仍然合适,只需确保在完成后删除所有临时文件。如果你不会写临时文件,那么计算杂技可能是你唯一的解决方案...

标签: c# .net dynamic compilation compileassemblyfromsource


【解决方案1】:

我在我的一个应用程序中执行此操作,如果出现错误,我会写出已编译的源 - 生成编译器错误的源 - 以及编译期间生成的所有错误消息。我将这些错误消息放在 cmets 中并将它们附加到源文件的末尾。如果我没记错的话,源文件是用 File.WriteAllText() 写入的,在用户临时目录中的一个文件中,然后我用该源模块的路径抛出一个异常。所有这一切只有在出现编译错误时才会发生。如果没有错误,那么我不会以这种方式写出源代码。

在我的例子中确实只有一个模块,因为我将所有源连接到一个模块中。在这种情况下,“第 143 行”的含义并不令人困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多