TypeLoadException:可收集类型“{0}”可能没有Thread或Context静态成员

时间:2013-11-04 20:00:33

标签: c#

我面临一个奇怪的例外:谷歌找不到任何关于它的东西(这是非常罕见的)。

代码:

new Query<TElement>(/* ... arguments ...*/);

Thew a exception

  

System.TypeLoadException

     

收藏类型'L.Caching.Query`1 [&lt;&gt; transientClass1]'可能没有线程或上下文静态成员。

我终于解决了这个问题,但这值得一谈谷歌! (我会回答这个问题)

让我把事情放在他们的背景下:

  • 我正在调用从运行时编译的lambda中抛出异常的“new”。
  • 取代TElement的课程,例如<>transientClass1,是一个动态生成的类(使用Reflection.Emit) - 非常无情:它等同于编写匿名类型时生成编译器的类型new{a=thing, b=otherThing}
  • 这个“anonmyous”课程在我的应用程序的许多其他部分都很好用(不要考虑错误的IL发射)
  • Query<T>只是另一个通用类。

什么可能导致该异常?

1 个答案:

答案 0 :(得分:0)

答案部分在'Collectible Assemblies for Dynamic Type Generation'

的最后一部分
  

线程静态数据不支持线程静态变量。

但是这部分是不够的,因为类<>transientClass1没有声明任何线程静态数据。

Query<T>确实如此。因此,由于<>transientClass1属于可收集的程序集,Query< <>transientClass1>必须符合相同的要求(因为它也可以收集)。

这就是为什么可以使用Query<T>成功的原因,<>transientClass1也是如此,但混合两者都抛出了这个例外。

要解决这个问题,我只需要在另一个类中移动我的线程静态字段(并在Query<T>中安全使用)。