【问题标题】:C# System.TypeInitializationException When Generic Types used使用泛型类型时的 C# System.TypeInitializationException
【发布时间】:2018-04-01 17:23:21
【问题描述】:

当我尝试调用以下命令时,我在 C# 中收到 System.TypeInitializationException:

List<BuyShopItem> buyShopItemList = new List<BuyShopItem>(0);

BuyShopItem 在外部程序集中,包含以下内容:

namespace GameProtocol
{
    public struct BuyShopItem
    {
        public int ShopItemID;
        public int Amount;
        public int GoldPrice;
        public int SilverPrice;
        public int CharacterPointPrice;
        public int ResearchPointPrice;
    }
}

应该是外部程序集的原因吧?

不幸的是,我无法更改它,因为我需要将 BuyShopItem 再次传递回另一个外部程序集。

关于程序集的一些信息:它来自 Unity 游戏,.NET 3.5(根据 DotPeek:msil, .Net Framework v3.5

我在 SharpDevelop 和 Visual Studio 2017 中都遇到了这个问题,所以它可能与 IDE 无关。 peverify的结果:

Microsoft (R) .NET Framework PE Verifier. Version  4.0.30319.0
Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten.

[MD]: Error: Field has a duplicate, token=0x040059d7. [Token:0x040059CF]
[MD]: Error: Field has a duplicate, token=0x040059cf. [Token:0x040059D7]
[MD]: Error: Field has a duplicate, token=0x0400a48b. [Token:0x0400A478]
[MD]: Error: Field has a duplicate, token=0x0400a478. [Token:0x0400A48B]
4 Fehler wird/werden überprüft Assembly-CSharp.dll

如果您有任何提示,请告诉我。我会尽快尝试。

这是 Visual Studio 2017 中异常的屏幕截图: https://i.imgur.com/WHCbWTM.png

更新:我刚刚尝试了以下操作:Console.WriteLine(typeof(BuyShopItem));,发生了同样的错误。为什么无法获取类型?

【问题讨论】:

  • 异常是否有InnerException 或其他消息? TypeInitializationException 表示该类型的构造函数存在异常。如果你这样做var x = new ButShopItem(),它是否有效?
  • 您在异常中收到的消息是什么?
  • 一个包含零项的列表,看起来毫无意义。要么关闭参数,要么使用大于零的数字。
  • 必须尝试 List&lt;BuyShopItem&gt; buyShopItemList = new List&lt;BuyShopItem&gt;(); 假设您的 BuyShopItem 是完整的,它没有一个需要 int 的构造函数
  • @Camilo Terevinto InnerException {"Die Common Language Runtime hat ein ungültiges Programm gefunden。"} System.Exception {System.InvalidProgramException}

标签: c# .net visual-studio .net-assembly peverify


【解决方案1】:

可以创建一个长度为零的结构列表。

创建在不同程序集中定义的某种类型的列表也是可以的 - 但请检查以确保可以在运行时找到必要的 DLL。

结构实例的构造通常相当安全 - 但请检查是否存在引发异常的自定义构造函数。

还要仔细检查 BuyShowItem 结构是否指定了调用其他代码的任何静态字段,这反过来可能会失败。这通常是 TypeInitializationException 的根本原因。

见:https://msdn.microsoft.com/en-us/library/system.typeinitializationexception(v=vs.110).aspx

【讨论】:

  • 感谢您的回答,但如果我在自己的代码中复制完全相同的代码(这与我在问题中写的相同,除了我剥离了一些 dotPeek 的 cmets),它就可以工作。所以这不可能是代码问题,而是程序集的某种问题。我现在有某种解决方法,但这不是发生此错误的唯一部分。正如您在代码中看到的,该结构包含正常的整数值并且没有构造函数。
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多