【问题标题】:Source files mismatch when stepping into .NET Framework code进入 .NET Framework 代码时源文件不匹配
【发布时间】:2020-11-03 19:32:43
【问题描述】:

动机

我正在尝试跟踪打开与 Access mdb 数据库文件的连接时 .NET Framework 引发的异常。我没有直接打开数据库连接,而是使用 DevExpress Xpo 工具之一(确切地说是 XpoDefault.GetDataLayer(...)),它在内部尝试创建与提供的 mdb 数据库文件的连接。该尝试在 .NET Framework 代码深处的某个地方失败并引发异常。

Exception 具有 System.Data.OleDb.OleDbException 类型,并且对问题来源非常模糊。消息说“未指定的错误”。 ErrorCode 为 -2147467259(NativeCode 为 0)。很少有信息可以找出无法创建数据库连接的原因。我认为也许深入研究 .NET Framework 代码会揭示有关失败的一些重要信息。

问题

进入 .NET Framework 内部时源文件不匹配。执行流程不一致。

说明

我的应用程序面向 .NET Framework 4.6.1 x86 平台并内置调试(发布不会改变任何内容)。 Visual Studio Enterprise 2019 v16.6.3 是我使用的 IDE。当然,我已经阅读了所有关于调试到 .NET Framework 的内容,但它并没有帮助解决我的问题。

到目前为止我做了什么?我已成功下载 DevExpres PDB 和源代码。没问题 - 我可以跟踪 DevExpress 内部的执行(恕我直言,整体调试设置是相当正确的)。似乎在调试期间从 Microsoft 服务器正确加载了 .NET Framework PDB。我认为 Visual Studio 调试设置也很好(据我所知)。

一切顺利,直到我需要进入 OleDbConnection.cs 文件,该文件给出以下消息:

问题是我有来自https://referencesource.microsoft.com 的所有.NET 源。从 4.5.1 到最新的 4.8 的所有(包括更新)。

无论我选择哪一个 - 我总是收到关于源文件版本不匹配的相同消息。当我忽略该消息并决定使用源文件时,很快就会发现不一致是真实存在的。我没有跟踪源代码执行,而是跨过 cmets 或执行流程,根本没有意义,而且很明显,呈现的源代码与正在发生的事情不同步。

好的,就是这样。我无法走得更远。难道我做错了什么?在哪里寻找与执行模块匹配并允许发现我遇到的异常的来源的 .NET Framework 源?

更新@tgolisch

给出异常的代码:

Session Session;
ReflectionDictionary reflectionDictionary;
string connectionString;

...

Session = new Session(XpoDefault.GetDataLayer(connectionString, reflectionDictionary, AutoCreateOption.SchemaOnly));

XpoDefault.GetDataLayer(...) 调用中使用的连接字符串:

"Provider=Microsoft.Jet.OLEDB.4.0;Password=;User ID=Admin;Data Source=C:\\Svn\\trunk\\Apps\\bin\\Debug\\DbFile.mdb;Mode=Share Deny None;"

XopDefault.GetDataLayer(...) 是调用失败并抛出异常。

更新@Perry Qian-MSFT

我完全按照你的建议做了,但没有成功。根本没有任何改善。但是,在禁用系统程序集的优化(如here 所述)后,我取得了相当大的进步。关闭优化后,.NET Framework 内部的跟踪变得可行。不再随意跳跃或跨过评论行。

但是,它还没有完全成功,因为我仍然收到有关执行模块和源代码文件版本之间不匹配的消息

我还注意到,即使我的应用程序以 .NET Framework 4.6.1 作为目标,它在执行期间仍然使用 4.8 版的系统模块:

这表明我在进入框架内部时应该使用 .NET Framework 4.8 源代码。但是等一下 - 我已经尝试了所有可能遇到相同不匹配问题的来源。

还可以看出,与应用程序一起运行的系统程序集版本不止一个 - 4.8.4110.0 和 4.8.3761.0,这表明可能使用了不同的源来构建它们。

然而,无论我采用哪种来源,总会在某些时候出现关于来源不匹配的消息。

考虑到程序集优化问题已经解决,我现在应该使用哪些框架源来让它们与正在运行的模块同步?

【问题讨论】:

  • 请发布您用于连接到 MS Access DB 的代码以及连接字符串(已删除文件路径和密码)。如果您的连接字符串或 conn obj 错误,则会产生各种误导性错误。另外,您是否尝试过检查内部异常堆栈?有时这些有有用的信息。
  • @tgolisch 我已经用建议的信息更新了原文。也许我应该生成另一个线程来单独处理 MS Access DB 连接问题,因为在这里我们解决的是调试问题,而 MS Access 问题更像是一个背景问题。不过,我也很高兴听到有关连接问题的任何建议。
  • 我注意到您的路径中提到了“svn” 如果那是源代码管理产品,它可能会将您的文件标记为“只读”。每次构建时(或者有时在运行 prog 时),VStudio 也会擦除和重建“/bin/debug/”文件夹。尝试将 MDB 文件复制到其他文件夹,例如 c:\data 或 c:\temp。确保它不是只读的,并相应地设置您的连接字符串路径。这可能不是问题,但也许。

标签: c# .net visual-studio-debugging oledbconnection pdb-files


【解决方案1】:

进入 .NET Framework 代码时源文件不匹配

请重新连接您的 DB Access 数据库以刷新您的数据库,以防 db 层出现一些构建错误。

此外,请按照以下建议解决您的奇怪问题:

1) 工具-->导入和导出设置-->重置所有设置--> ..常规重置所有调试设置。

2)然后,关闭VS,删除解决方案文件夹下的.vs隐藏文件夹,binobj文件夹。

【讨论】:

  • 我听从了你的建议,但没有成功。不过我已经取得了实质性的进展。了解最新情况。
  • 一个建议是,你可以在新的vs2019中尝试一个新的net framework项目,然后将你旧项目的内容迁移到新项目中,测试问题是否仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多