我已经广泛搜索和调试了,我无法弄清楚导致此异常的原因。有趣地重新安装.NET框架有时会解决这个问题,但它似乎有点粗略作为修复:
TypeInitializationException: The type initializer for '<Module>' 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 <CrtImplementationDetails>.LanguageSupport.InitializePerAppDomain(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport._Initialize(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
任何线索?
上下文
这是一个WinForms应用程序,用C#编写,带有一些用WPF编写的新组件。崩溃报告我们得到的内容不包括我正在显示的内容(堆栈跟踪等),我们没有做任何C ++,托管或其他。
我无法重现此崩溃,但是少数客户的远程诊断表明重新安装.NET框架可能为该客户修复此问题。
报告此次崩溃的客户多次这样做,看起来在重新安装.NET框架之前他们无法使用该应用程序,或者他们恢复到仅使用.NET 2.0的应用程序的旧版本
链接
Some links表示.NET Framework的beta版本或visual studio与此崩溃之间可能存在连接,但在这种情况下似乎不太可能。
另一种可能的连接可能是Visual C ++ 2005可再发行组件。
答案 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)
对我来说,当我在使用配置文件中的值初始化的类中有一个静态变量时,会发生错误。
配置文件没有值,这在初始化类时导致异常。