有关TypeLoadException的帮助

时间:2010-12-27 15:27:59

标签: .net vb.net exception typeloadexception

我正在编写一个.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: 

以下是我正在运行的代码:

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

我有什么遗漏吗?

6 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

看来Nutzy还有一个similar problem,他通过将所有类,表单和控件复制到一个新项目来解决它。我也这样做了,问题解决了。

谢谢Jim Mischel和Paul Alexander的帮助。我投票帮助你帮助我解决问题。

答案 2 :(得分:1)

最可能的原因是它在尝试加载其中一个设置时抛出异常。您可以尝试在Initialize方法的第一个语句中设置断点。 可能让您有机会单步查看错误的位置。

或者,您可以在加载每个值后使用Debug语句(请参阅System.Diagnostics),以确定其失败的位置。

答案 3 :(得分:1)

我遇到了同样的问题,我确信它是VisualStudio或JIT编译器中的一个错误。我知道它与DLL或x64 vs x86无关,因为我的测试项目中没有自定义引用。我将违规行追踪到结构的成员变量。这个特定的成员变量没有什么有趣的(它是一个简单的类:)

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct Foo
    {
        int x;
    }

它是如下成员。如果#if为真,它就有效。如果我将其更改为#false,则编译时没有错误,但是在运行时,当我在整个类中访问任何内容时,它会给我TypeLoadException

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct uartparam_t
    { //size 112
        public UInt16 portnum; //0
        public Byte conntype;
        public Byte baud;
        public Byte databits;
        public Byte stopbits;
        public Byte parity;
        public Byte flowctrl;
#if true
        public int remoteip;
#else
        public Foo remoteip; //8 -- for some reason this is making the program crash! ?!?!?
#endif

     ....

的一部分
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct config {
 ...
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXUARTPORT)]
        public uartparam_t[] uartparam; //(size 1792)
 ...
    }

没有任何意义。我尝试完全重建应用程序,以及在新解决方案中创建一个新项目,但这些都没有帮助。让它工作的唯一方法是将结构更改为int,并处理结构外部从int到Foo的类型转换。

答案 4 :(得分:0)

我在向产品添加代码时经常遇到此错误。我们遇到的问题是该产品的最新版本安装在GAC中,我正在尝试在我的开发人员计算机上测试新功能。我运行的应用程序取决于我在本地构建的新功能,但该应用程序从GAC加载不包含新功能的程序集。当我卸载产品时,异常就消失了。

答案 5 :(得分:0)

我的问题是父程序集,DLL具有相同的程序集名称。

e.g。 Application.exe和Application.dll

我将每个名称都更改为项目属性中的单独名称(例如Application.exe和Library.dll),并修复了问题。我猜选择的答案(“转移到新的解决方案”)他们也在重新命名项目。