不支持URI格式.异常开始出现在旧的,未修改的代码中
本文关键字:未修改 代码 格式 URI 异常 开始 不支持 | 更新日期: 2023-09-27 17:50:00
好吧,我遇到了一个真正随机的错误,我找不到任何原因会发生这种情况。我有一个应用程序,我更新,最初开发了许多年前。我在一个相当大的开发团队中工作,他们的唯一职责就是管理这个应用程序,我们已经开始接受这个项目有点像"弗兰肯代码"项目。我们只是继承了这个项目的几代开发者中的一员。(这一点稍后要知道。)
在初始化过程的深处,应用程序的一部分调用了以下代码:
string strPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
string strFile = strPath.Substring(6) + "''" + FILE_NAME;
是这样的。我的团队成员和我自己,已经能够修改和构建我们的解决方案的更高层次,UI和DB相关的部分。我,而不是其他任何人,修改了上面的代码,或者相同代码文件中的任何代码(或者解决方案中的项目,就此而言)
然而,今天在我的应用程序的一个完全不同的部分工作时,我开始得到一些非常奇怪的"内存不足"异常错误。我不确定这是否与我的问题有关,但我觉得值得一提的是,在重启我的机器并重新加载VS解决方案后,当我尝试运行调试器测试时,当初始化过程试图执行上述代码片段时,我现在一直得到以下异常:
Exception: System类型的第一次异常。在mscorlib.dll中发生ArgumentException'消息:不支持URI格式
我在谷歌上搜索了这个错误信息,看起来原来的开发人员只是做错了。这似乎是一个常见的错误,但令我困惑的是,直到今天才出现这个问题。
我知道这是一个奇怪的问题,但是有没有一种方法可以在不修改代码的情况下修复这个问题?正如我所提到的,这是一个非常复杂的应用程序,通常感觉有点拼凑在一起。我们的团队正试图清理或替换应用程序的大部分功能,但有些部分我们根本不碰,因为我们没有确切的线索,知道应用程序部署到生产环境后将如何工作。这是一个非常关键的应用程序,它不能被破坏。
可能有人有任何线索可能导致这种"神奇"开始发生?特别是因为我一直在与ui相关的代码中工作,并且没有接近低级别的配置解析部分的代码,这是来自的。
<标题>附加指出h1> li>我们使用源代码控制。如果我下载,构建并运行应用程序的旧版本,它就可以工作了。任何帮助都是感激的。我为小说感到抱歉。我只是被难住了,我宁愿不使用不同的方法来获取这个路径字符串,如果有任何机会改变这个过程可能在不同的用户环境中表现不同。
标题>我只能假设Visual Studio中与项目/解决方案相关的某些工作文件已经损坏。我搜索了我的项目文件的文本,以及我所有的代码,我没有看到任何不合适的地方。
正如我提到的,我们使用源代码控制。为了尝试修复,我拉下了与最初为当前任务拉下的相同的源版本。我编译并运行了这个应用程序。在"vanilla"状态下一切正常。
接下来,我复制了所有我知道我修改过的文件。我没有添加任何新的项目引用或资源,所以我只是复制了修改过的.cs
文件。我构建并运行了这个应用程序,自从从我的分支中拉出来之后,我没有遇到任何麻烦。
这并不能回答为什么会出现这个问题,但是这个方法可以提供一个解决问题的方法。
我可以在Path中确认这个更改。在安装VS 2015并在其中重建我们的项目后,我想到了GetDirectoryName,因此它看起来像是。net 4.6的功能。在VS 2013中再次重建项目将返回先前的行为,其中Assembly。带有"file:"前缀的CodeBase被Path接受。GetDirectoryName无例外。但是重读MSDN文档,有一条声明不支持"file:"路径,但这在VS 2015代码中抛出的ArgumentException中没有提到。
首先,找出这个问题在多少个版本之前开始发生:从当前版本开始,一个变更集一个变更集地往回看,直到它不再失败。
听起来,不管出于什么原因,System.Reflection.Assembly.GetExecutingAssembly().CodeBase
现在返回一个GetDirectoryName
不喜欢的字符串。因此,检查项目文件、.sln
、repo配置,以及任何可能导致文件位于不同位置的内容。
如果你在那里找不到任何东西,检查来自同一提交的其他文件,即使它们看起来不应该相关。
First Chance异常通常发生在多个线程发生的时候,所以检查以前版本中没有的新线程。我也遇到过这样的情况,第一次机会异常只会在某些情况下被捕获,否则会被静默地忽略,所以看看Debug设置中的变化:这个问题可能一直存在,你只是直到现在还没有正确的设置来捕获它。
请记住,在源代码控制下,其他人可以更改属于"你"的东西,即使只是偶然。