TypeInitializationException: "<Module>" 的类型初始化程序引发了一个异常。

9

我进行了广泛的谷歌搜索和调试,但是我无法弄清楚是什么导致了这个异常。有人说重新安装.NET框架有时可以解决问题,但作为一种解决方法似乎有些不可靠:

TypeInitializationException: The type initializer for '&lt;Module&gt;' threw an exception.
    The C++ module failed to load during appdomain initialization.

      The system cannot find the file specified

StackTrace:
   at CModuleInitialize.LoadWpfGfx(CModuleInitialize* )
   at CModuleInitialize.{ctor}(CModuleInitialize* )
   at ?A0x828d0bb1.??__E?A0x828d0bb1@cmiStartupRunner@@YMXXZ()
   at _initterm_m((fnptr)* pfbegin, (fnptr)* pfend)
   at &lt;CrtImplementationDetails&gt;.LanguageSupport.InitializePerAppDomain(LanguageSupport* )
   at &lt;CrtImplementationDetails&gt;.LanguageSupport._Initialize(LanguageSupport* )
   at &lt;CrtImplementationDetails&gt;.LanguageSupport.Initialize(LanguageSupport* )

有任何线索吗?

背景

这是一个WinForms应用程序,使用C#编写,并使用少量新的WPF组件编写。我们收到的崩溃报告除了我展示的(堆栈跟踪等)之外没有更多的上下文信息,而且我们没有做任何C++、托管或其他方面的工作。

我无法重现此崩溃,但远程诊断几个客户表明,重新安装.NET框架可能会为该客户解决此问题。

报告此崩溃的客户会多次报告,似乎他们在重新安装.NET框架或回退到仅使用.NET 2.0的旧版本应用程序之前都无法使用该应用程序。

链接

一些链接表明.NET Framework的测试版或Visual Studio与此崩溃可能有关,但在这种情况下似乎不太可能。

另一个可能的联系可能是与Visual C++ 2005可再发行组件有关。


你能提供更多信息吗?比如你使用的编程语言、异常发生的时间以及你正在尝试做什么(看起来像是Managed C++)?目前你提供的信息太少,很难猜测问题所在。 - Kieren Johnstone
好的,Kieren说得对;我会在问题正文中添加更多内容。 - John Weldon
5个回答

16

您正在查看PresentationCore的内部,这是用C++/CLI编写的代码。类名<Module>是所有全局C++/CLI函数的名称。在程序集加载后立即失败是因为模块初始化器失败了。LoadWpfGfx()所完成的确切任务没有任何文档记录,但很容易猜测。它正在加载一个实现图形接口的非托管DLL,可能是DirectX接口层。

这是一个与机器相关的问题。该函数检查注册表以获取正确的DLL,然后使用LoadLibrary()加载它。显然缺少了这个DLL文件。您的客户需要让他们的计算机稳定运行,然后重新安装.NET。如果仍有问题,他们可以使用SysInternals的ProcMon工具查看正在搜索哪些注册表键和DLL。


非常好,谢谢 Hans。我会尝试获取一台存在此问题的计算机,并使用 procmon 跟踪注册表查找。 - John Weldon

2
这个问题困扰我数月。我的代码使用Oxygene Pascal编译器构建,与VS 2012完全集成。当..cctor未能完成其工作时,TypeInitializationException会发生。
我该如何找出原因呢?为什么我的C#类库代码在WCF Web服务下运行良好,但Oxygene类库代码在远程主机上访问时经常失败,但在本地和进行VS 2012单元测试时都运行良好呢?
好的,这是一个类库 1. 我在CS ToolboxCS.cs中编写了一个类库 2. 我在Oxygene ToolboxPAS.pas中编写了相同的类库 3. 一个ToolboxCS可以在远程运行,而ToolboxPAS则无法运行 4. 让我们看看这两个代码 4a)
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace ToolboxCS
{
    [CompilerGenerated]
    [StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
    public static class __Global
    {
        public static string Stop_Time = "1949.Mar.19";
    }
}

4b) Oxygene示例
namespace ToolboxPAS;
interface
uses
  System;
VAR
  Stop_Time: String := "1949.Mar.19";
implementation
end.

然后我使用ILSpy.exe查看生成的代码,发现反汇编为CS的代码是相同的。但是通过ILSPy.exe查看两个示例的程序集信息,我可以看到许多差异,其中一些没有影响,但下面显示的这一个对我的Oxygene ToolboxPAS.pas类库来说是致命的,因为它应该在IIS 7.5上运行->w3wp.exe->xyxyxyxyxy.dll->ToolboxPAS.dll。
{$IFDEF DEBUG}
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default or 
DebuggableAttribute.DebuggingModes.DisableOptimizations or 
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints or 
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
{$ENDIF}

换句话说,如果您进行调试构建,则您的cs代码将不会在程序集信息文件中显示具有此属性的程序集。但是,您将看到这些属性在使用ILSpy.exe查看生成的DLL时生成并使用。
我已经将此属性添加到我的ToolboxPAS.pas程序集信息文件中(如上所示),对于调试构建,在访问其中一个简单变量时它不再引发InitializationException异常。
自从我在我的大型DLL类库(12个DLL)的所有程序集信息文件中做出更改后,它们在部署到远程Web服务器IIS 7.5作为WCF web站点Web服务时运行得非常顺畅。

0
我也遇到了这个问题,但我的解决方案不是这些中的任何一个。原因是我有一个未管理的类,其中包含一个返回托管指针的虚函数。
class A
{
    virtual ManagedType^ Foo();
};

显然,C++/CLI运行时无法处理这个问题。移除虚函数可以解决这个问题(幸运的是,在我的情况下不需要虚函数)。


0

对我来说,错误发生在我有一个静态变量的类中,该变量使用配置文件中的值进行初始化。

配置文件没有值,这导致在初始化类时出现异常。


0

我收到了相同的错误信息。我使用的一个组件需要 .net framework 3.0,但是我的应用程序针对的是2.0版本。在用户机器上安装了3.0版本的用户可以正常运行我的应用程序,但是没有安装的用户则无法运行。

我希望大多数人不会遇到这个问题,但这是一种可能性。


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