找到不是直接来自我的代码的托管exception的来源?

如果这真的是一个超级用户问题我提前道歉…我只是不确定,但这似乎更多的开发。 一边而不是技术支持方面。 🙂

这不一定是个问题,但它确实让我在我的系统上完全疯狂。 它也只发生在我的电脑上。

当我启动任何应用程序,甚至是空白的WPF应用程序时,我看到四个例外:

在PresentationCore.dll中发生了’System.IO.DirectoryNotFoundException’类型的第一次机会exception
mscorlib.dll中发生了’System.ArgumentException’类型的第一次机会exception
mscorlib.dll中发生了’System.ArgumentException’类型的第一次机会exception
在PresentationCore.dll中发生了’System.InvalidOperationException’类型的第一次机会exception

为了弄清楚它们来自何处,我然后设置VS2008来打破任何抛出的CLRexception,这里是信息:

例外#1:
找不到路径’D:\ Dell \ Reader2.0 \ SPLASH.SYS \ fonts \ AscenderUni.ttf’的一部分。

例外#2:
不支持文化名称’ug’。
参数名称:名称

例外#3:
不支持文化名称’ug’。
参数名称:名称

例外#4:
IetfLanguageTag’ug’没有注册CultureInfo。

我通过Process Monitor和Process Explorer进行了调查。 Process Monitor显示我的应用程序正在执行一个RegQueryValue,我当然不负责……但是一些DLL(可能来自Dell crapware)正在被我的进程加载并正在读取这个regkey。 然后我查看了Process Explorer,希望看到我的应用程序正在加载哪些DLL,但无法找到该信息。 然后我尝试了PrcView并看到了我的应用程序正在加载的模块。

我很惊讶地看到有多少其他模块被加载,但我没有看到戴尔相关的任何东西。 我也想知道如何将Norton Internet Security DLL加载到我的进程中,但我认为这是有意的,Norton会采取一些特殊措施来确保进程可以安全执行。

我还能做些什么来识别和删除这些例外的来源?

UPDATE

不确定这是否让我感到困惑。 这个exception是在我的应用程序由于某种原因加载的DLL中引发的(我没有从我的项目中引用与Dell相关的任何内容)。 我现在卸载了那个应用程序,我仍然得到了愚蠢的例外。 这一切在技术上都很好,因为exception是在某个地方处理的,可能是在那个DLL中,但是我只是因为运行我的应用程序时弹出了四条额外的消息(实际上是8,因为我必须关闭每个exception的两个对话框)。 叫我懒,但我从来没有问过这个该死的DLL首先加载。 🙂

也许现在是时候使用msconfig开始禁用某些戴尔服务了。 我实际上有空闲时间后会玩这个。

没有文件损坏。 因为我一直试图将这个打倒一段时间,我想出了发生了什么。 在某个地方,一个字体安装了维吾尔文化,这显然是土耳其/中国文化(尽我所知)和他们的CultureInfo标签? “微克”。 当缓存字体时,系统试图加载维吾尔族文化。 可悲的是,我的Windows安装似乎在Windows中明显缺少这种文化。 知道我不会很快在我的机器上使用这种文化,我按照MSDN上的指示创建并安装了一种新的文化。

虽然错误不会伤害任何重大事件。 这只是第一次机会exception,毕竟,这让我很烦恼。 所以这就是我做的。

  1. 创建一个新的控制台应用。
  2. 添加对sysglobal的引用。
  3. 添加以下代码:

    var culture = new CultureAndRegionInfoBuilder("ug", CultureAndRegionModifiers.None); var ci = new CultureInfo("en-US"); var ri = new RegionInfo("US"); culture.LoadDataFromCultureInfo(ci); culture.LoadDataFromRegionInfo(ri); culture.Register(); 
  4. 建立。

  5. 从Windows资源管理器(您需要管理员权限执行此操作),以管理员身份运行已编译的可执行文件

如果一切顺利,现在应该在C:\ windows \ Globalization中有一个名为“ug.nlp”的文件。

您不应该再次收到该消息。

我有同样的问题。 它在我做了之后就消失了:

清除WPF字体缓存并重新启动Visual Studio。 清除缓存: http : //support.microsoft.com/kb/937135

埃里克

它不太可能是您机器上的铲子。 这些DLL也需要将自己注入到非托管程序中,它们必须用不依赖于CLR的语言编写,如C或C ++。 因此无法生成托管exception。

这些exception看起来像我的机器配置问题。 你的注册表中的垃圾。 糟糕的文化名称(听起来像“我们”被破坏为“ug”)生成其中三个,该字体可能列在注册表中但在磁盘中丢失。

从操作系统重新安装开始,您可以通过使用ProcMon和调试器来诊断它。 使用Debug + Exceptions,Thrown复选框强制调试器停止第一次机会exception。 当它命中时,切换到ProcMon,注册表项或文件应该在跟踪结尾附近可见。

通过以上答案的引导我能够通过删除字体“Microsoft Uighur Regular”来解决这个问题

第一次机会exception是正常的 – 只要抛出exception,无论是否处理,都会显示这些exception。 它们存在,因此您可以进入代码并找出它们被抛出的原因。

但是,如果已处理exception,则没有问题并且将继续执行。

如果未处理exception,调试器将捕获第二次机会exception,执行将暂停。

这是正常的,不应该引起关注。 您可以随时隐藏它们 – 有关详细信息,请参阅此问题和答案。

关于实际的exception – 有一些代码(第三方或你自己的)试图访问提到的目录中的ttf ,这是无法找到的,因此exception(已经处理,所以没问题)。

其他例外是​​由于创建了一个不存在的 CultureInfo( ug ) – 也许这应该是uk ? 检查配置和代码。

可以在注册表中配置这些值。