【问题标题】:Could not load type from assembly (the executable)无法从程序集中加载类型(可执行文件)
【发布时间】:2014-12-19 01:40:19
【问题描述】:

这在 Windows 中运行良好,但尝试在 Mono 中运行时出现以下错误:

Unhandled Exception:
System.TypeLoadException: Could not load type 'WLBot.LobbyBot.LobbyBot[]' from assembly 'WLBot, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
  at System.Collections.Generic.Dictionary`2[WLCommon.Matches.MatchSetupDetails,WLBot.LobbyBot.LobbyBot].InitArrays (Int32 size) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Dictionary`2[WLCommon.Matches.MatchSetupDetails,WLBot.LobbyBot.LobbyBot].Init (Int32 capacity, IEqualityComparer`1 hcp) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Dictionary`2[WLCommon.Matches.MatchSetupDetails,WLBot.LobbyBot.LobbyBot]..ctor () [0x00000] in <filename unknown>:0 
  at WLBot.Client.WLBotClient..ctor (System.String url, System.String botid, System.String secret) [0x00000] in <filename unknown>:0 
  at WLBot.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Could not load type 'WLBot.LobbyBot.LobbyBot[]' from assembly 'WLBot, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
  at System.Collections.Generic.Dictionary`2[WLCommon.Matches.MatchSetupDetails,WLBot.LobbyBot.LobbyBot].InitArrays (Int32 size) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Dictionary`2[WLCommon.Matches.MatchSetupDetails,WLBot.LobbyBot.LobbyBot].Init (Int32 capacity, IEqualityComparer`1 hcp) [0x00000] in <filename unknown>:0 
  at System.Collections.Generic.Dictionary`2[WLCommon.Matches.MatchSetupDetails,WLBot.LobbyBot.LobbyBot]..ctor () [0x00000] in <filename unknown>:0 
  at WLBot.Client.WLBotClient..ctor (System.String url, System.String botid, System.String secret) [0x00000] in <filename unknown>:0 
  at WLBot.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

这有点让人生气,因为这个类实际上是编译成 exe 的,而不是像 dll 中那样分开。我看到的所有答案都是关于尝试从库中加载类型。

即使我在项目中重新创建类,也会发生同样的事情。我很困惑为什么会这样。我该如何解决这个问题?

【问题讨论】:

  • “即使我在项目中重新创建类,也会发生同样的事情。” - 调试器说什么?
  • @Maarten 这个完全相同的错误,调试器中断时没有更多信息。不太确定您可能希望从中获得哪些其他信息。创建字典时它会中断。
  • 你能显示代码吗?你在说什么字典?
  • @Maarten 我不知道代码的哪一部分是相关的,我有一本这样的字典:private Dictionary&lt;MatchSetupDetails, LobbyBot.LobbyBot&gt; Bots = new Dictionary&lt;MatchSetupDetails, LobbyBot.LobbyBot&gt;();
  • 我有命名空间说明符,因为命名空间名称与类名相同,但是我尝试使用不同的唯一命名空间和类名,但总是会发生同样的事情。

标签: c# mono typeloadexception


【解决方案1】:

不是 OP 的答案,而是未来的 googlers,我在 Windows 上编译并复制到运行 Raspbian (jessie) 的 Raspberry Pi 的二进制文件时遇到了这个问题。

同样,在 Windows 上运行也很好。

Mono 的受影响版本(由 tarball 构建)是 4.6.0.125/753c323

修复是升级到4.6.1.5/ef43c15

【讨论】:

    【解决方案2】:

    这个答案对你来说似乎真的很有趣:Mono-LibreOffice System.TypeLoadException

    引用的答案:

    .NET 框架有一个真正的即时编译器。 Mono 没有,它有一个 AOT(Ahead Of Time)编译器。换句话说,它积极地编译程序集中的所有代码,而不仅仅是将要执行的代码。

    因此,与其试图理解代码行(你的构造函数),不如试着想想你可能会调用什么。他使用var 而不是声明变量类型本身。这将阻止 Mono 在您的进程中提前推进,并在您执行时让它决定类型。

    希望它可以帮助您调试代码。

    【讨论】:

    • 谢谢,我试试这个。
    • 遗憾的是,您不能在类定义中使用类型 var。还有其他想法吗?
    • @ChristianStewart 你在哪里跑步?它是一台 Ubuntu 机器吗?尝试仅使用 Main 控制台应用程序创建一个空白单声道项目,该应用程序对您在应用程序中引用的每个库进行单次调用。检查是否发生这种情况。尝试使用 var 变量。如果缺少某些单声道库,您应该知道。
    • 没有缺少单声道库。普通的单声道程序运行良好,包括我过去编写的极其复杂的程序。它只是这个类中有问题的字典定义。我不能使用 var 类型,因为它是类属性。
    • 嗯.. 我对这个AOT 问题的最后猜测是:尝试禁用它(check here)。对不起...
    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2011-09-07
    • 2016-09-27
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多