gpt4 book ai didi

.net - 关于 TypeLoadException 的帮助

转载 作者:行者123 更新时间:2023-12-02 20:35:37 26 4
gpt4 key购买 nike

我正在编写一个 .NET 3.5 应用程序 (WinForms),它使用外部 DLL 中的类,并且每次应用程序尝试启动时我都会收到 System.TypeLoadException
这是 VS 显示的异常:

System.TypeLoadException was unhandled  Message=Could not load type 'PolyMorph.Common.Settings' from assembly 'PolyMorph, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.  Source=PolyMorph  TypeName=PolyMorph.Common.Settings  StackTrace:       at PolyMorphApp.App.Initialize()       at PolyMorphApp.App.Main()       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)       at System.Threading.ThreadHelper.ThreadStart()  InnerException: 

Here is the code that I'm running:

Friend NotInheritable Class App

<STAThread()> Shared Sub Main()
'set the exception handlers'
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler
AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
'initialize the application'
App.Initialize()

'and then run the application'
Dim mainForm As New PolymorphHost
Application.Run(mainForm)
End Sub

Shared Function Initialize() As FunctionResult
If App.InitializeDataDirectory() = False Then
Return New FunctionResult(False, "the application's data directory")
End If


_settings = New PolyMorph.Common.Settings(AppDataDirectory & "\Settings.dat")
......code continues to load settings from the _settings variable
End Function
End Class



令我惊讶的是,VS2010 调试器停在 App.Initialize() 行,甚至没有进入 Initialize 函数。

但是,如果我在 Initialize 函数中注释掉对外部 DLL 的所有引用,应用程序就会正确初始化。

<小时/>

仔细阅读后,我意识到许多报告此错误的人在他们的项目上使用了不同的版本(例如从 x86 应用程序引用的 x64 DLL)。因此,我更改了构建配置,因此 DLL 和应用程序都是 x86,但我仍然遇到 TypeLoadException

我有什么遗漏的吗?

最佳答案

您应该查看 InnerException 和 LoadException 属性,以更好地了解依赖程序集未正确加载的原因。

它在初始化之前抛出异常的原因是该方法的 JIT 编译方式。第一次执行方法时,CLR 将验证并解析该方法中的所有 MSIL 指令,然后将其编译为运行时等效指令。由于 Initialize 方法使用 PolyMorph.Common.Settings 类型,因此 CLR 会在编译时尝试解析它。由于加载失败,Initialize 永远不会执行。

要捕获您自己的代码中的异常,只需将整个 Initialize 代码移至另一个方法,然后在 Initialize 的 try...catch block 中调用该方法。

Try
InitializeInternal()
Catch ex As TypeLoadException
System.Diagnostics.Debugger.WriteLine(ex.ToString())
End Try

关于.net - 关于 TypeLoadException 的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4539699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com