TypeInitializationException:'<module>'的类型初始值设定项引发了异常</module>

时间:2011-01-31 15:57:48

标签: c# wpf exception .net-3.5

我已经广泛搜索和调试了,我无法弄清楚导致此异常的原因。有趣地重新安装.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的应用程序的旧版本

链接

Some links表示.NET Framework的beta版本或visual studio与此崩溃之间可能存在连接,但在这种情况下似乎不太可能。

另一种可能的连接可能是Visual C ++ 2005可再发行组件。

4 个答案:

答案 0 :(得分:10)

您正在查看PresentationCore的内容,即使用C ++ / CLI编写的代码。名称<Module>是所有全局C ++ / CLI函数的类名。它早期炸弹,在装配完成后,模块初始化器失败了。 LoadWpfGfx()完成的确切工作没有记录在我所知道的任何地方,但很容易被猜到。它正在加载一个实现图形界面的非托管DLL,可能是DirectX界面层。

这是机器特定的问题。该函数检查注册表是否加载了正确的DLL,然后使用LoadLibrary()加载它。很明显,DLL丢失了。您的客户需要再次使其机器稳定,然后重新安装.NET。如果他们仍有问题,那么他们可以使用SysInternals的ProcMon工具来查看正在搜索的注册表项和DLL。

答案 1 :(得分:3)

这让我头疼了好几个月。 我的代码是使用Oxygene Pascal编译器构建的,与VS 2012完全集成。当..cctor无法以某种方式完成其工作时发生TypeInitializationException。

我做了什么来找出为什么我的C#类lib代码运行而我的Oxygene类lib代码在远程主机上的IIS 7.5下的WCF网站Web服务上访问时经常失败,但是BOTH在本地工作得很好规模,在进行VS 2012单元测试时效果很好。

好吧,它&#39;是一个类库 1.我在CS ToolboxCS.cs中编写了一个类库 我在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类lib的杀手,它应该在IIS上运行7.5 - &gt; w3wp.exe - &gt; xyxyxyxyxy.dll - &gt; 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&#39; s)的所有程序集信息文件中都更改了它,因此当它们作为WCF wen站点Web服务部署到远程Web服务器IIS 7.5时,它们都像嗅探一样。

答案 2 :(得分:0)

我有同样的错误消息。我使用的组件需要.net framework 3.0,但我的应用程序是针对2.0的。在他们的机器上安装3.0的用户运行我的应用程序没有问题,但那些没有运行它的用户。

不是很多我希望的问题,但这是一种可能性。

答案 3 :(得分:0)

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

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