我有一个.NET解决方案,它由几个项目组成。可以说其中一个项目在逻辑上是主项目,而所有其他项目都是辅助项目。我们的团队决定用另一种方式构建该项目。主项目将生成一个程序集(我将其称为主项目)。所有其他项目的程序集都是辅助项目,它们将作为资源嵌入到主项目中。
Primary项目中的SourceCodeForExceptionHelper
类负责使用PDB文件获取每个遇到的异常的原始源代码。为此,我使用了here描述的方法。它在我单独的概念验证项目中工作正常。但是当我试图将该类移动到真实的解决方案中时,我遇到了一个问题:IMetaDataDispenser.OpenScope
方法需要对程序集文件路径的非空引用。当然,我没有对任何二级程序集的这样的引用(因为它们的文件被嵌入在主目录中)。由于这个原因,我不能创建一个类型为ISymbolReader
的对象并读取源代码。我如何解决这个问题?顺便说一下,这个问题甚至更糟,因为我们只嵌入了辅助程序集,而没有它们的PDB文件(尽管我们会在必要时这样做)。
提前感谢您的任何帮助和建议!
1条答案
按热度按时间6ju8rftf1#
我不认为你可以使用.NET Framework内置函数来实现这一点,因为它们依赖于物理文件。然而,有一个使用Mono Cecil库的解决方案,因为它有一个重载,它将Stream作为输入,而不是其符号读取器的文件路径。
下面是一个名为“Testpdb”的控制台应用程序的示例,它将其IL代码转储到控制台,包括PDB信息:
注意:由于您只需要从PDB读取,因此可以重新编译定义READ_ONLY条件符号的塞西尔库以保存一些字节。您还可以将Cecil源代码直接嵌入到程序集中,而无需使用.DLL版本。