.NET CompileAssemblyFromSource:确定哪个源代码失败了?

5

我正在动态编译代码,使用CompileAssemblyFromSource并提供多个源。

在编译错误发生时,我可以从Errors集合中获取行号等信息。

但是,行号是所有源文件中的行号。我需要的是失败源文件中的哪个源文件和行号。

除了进行复杂计算外,是否有可能实现这一点?


3
我建议使用CompileAssemblyFromFile函数(至少作为调试或详细选项)。这样可以在编译后查看源代码,以便了解发生了什么。如果使用临时文件,之后可以清理它们。 - Paul Roberts
1
@Paul 那应该就是一个答案了! - Chris Shouts
@Paul:很抱歉,我不能使用临时文件。在我的解决方案中(具有特定问题),数据源来自许多个别来源(甚至来自最终用户),我只需要查看实际存在问题的源代码即可。 - Henrik Brinch
这行代码是来自单个源文件的行号,还是所有源文件合并后的行号?例如,如果你得到了第5行,它可能是任何一个源文件中的第5行。 - user957902
@Henrik:你所处的环境是否无法编写临时文件?从你的回答中我猜测,调试/详细解决方案不可行,因为你知道在生产场景中可能会出现错误(来自最终用户数据的代码几乎可以保证这一点!)。使用临时文件方法仍然可能是合适的,只需确保在完成后删除所有临时文件即可。如果无法编写临时文件,则计算技巧可能是您唯一的解决方案... - Paul Roberts
1个回答

0
我在我的一个应用程序中这样做,如果出现错误,我会写出编译的源代码 - 生成编译器错误的源代码 - 以及编译期间生成的所有错误消息。我将这些错误消息放在注释中,并将它们附加到源文件的末尾。如果我没记错的话,源文件是使用File.WriteAllText()写入到用户临时目录中的文件中,然后我会抛出一个带有该源模块路径的异常。所有这些只会在出现编译错误时发生。如果没有错误,则不会以这种方式写出源代码。
在我的情况下,实际上只有一个模块,因为我将所有源代码连接成一个单独的模块。在这种情况下,“第143行”是没有歧义的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接