2

我正在编写在 WindowsCE 6.0 上的 .NETCF 3.5 上运行的 C# 代码,该代码在运行时为 Func`2<> 抛出 MissingMethodExceptions。发生异常的代码部分是随机的。

奇怪的是,当您已经使用该应用程序一段时间并且肯定已经发生了对 Func`2 的许多调用时,就会发生这种情况。(例如,通过 IEnumerable.Select() 或 .Where()) 如果您在应用程序的生命周期内仅加载足够的类型以使程序集文件大小的总和超过 ~18MB,则似乎此行为开始。但是设备上有足够的内存(RAM)来加载类型。

还激活了 LoaderLogging 但无济于事。它只向我显示 Func`2 的 TypeLoad 错误。

当我没有想法时:这些错误的原因可能是什么?

不幸的是,我不能分享任何代码,因为它是 1) 我工作的公司的财产,以及 2) 数万行代码。

4

2 回答 2

4

.NETCF 似乎有一个限制:

每个泛型类型声明只能构造 1024 个唯一的封闭类型。(有关更多信息,请参阅“限制”部分:http: //blogs.msdn.com/b/romanbat/archive/2005/01/06/348114.aspx

意义:

List<int> a;
List<int> b;
List<int> c;

占用一个“槽”,

List<int> d;
List<string> e;

需要两个“插槽”(两个唯一的关闭),依此类推。

棘手的是:通常这会引发 ArgumentException,但有时 .NETCF 会引发 MissingMethodExceptions。(请参阅“3. 抛出异常的差异。”:http: //blogs.msdn.com/b/nazimms/archive/2005/01/25/360324.aspx

我们在可能的情况下通过使用我们自己的委托类型来减少 Func`2 的使用,这已经解决了问题。

于 2012-11-24T10:09:32.690 回答
0

如果您了解 Windows CE 内存管理的背景,您已经自己回答了您的问题:“...这样程序集文件大小的总和超过了 ~18MB。但是设备上有足够的内存 (RAM) 可用于加载类型……”

你知道,每个进程只有一个 32MB 的程序内存插槽,不管有 GB 或更多的 RAM!这是设计使然。您知道,由您或任何其他正在运行的进程加载的 DLL 被加载到每个进程的 32MB 插槽中(尽管 Windows Embedded Handheld 6.5 没有加载完整大小)。因此,加载的 DLL 越多,进程获得的可用程序内存就越少。有关更多详细信息,另请参阅http://community.intermec.com/t5/General-Development-Developer/Slaying-the-virtual-memory-monster/mp/16764

如果从 32MB 插槽底部开始增长的进程​​内存相对于从 32MB 插槽顶部加载的加载的 DLL 增长,您将获得奇怪的程序行为甚至崩溃。

以上适用于所有基于 Windows CE 5 的操作系统版本,例如 windows Mobile 6.1、Windows Mobile 5 甚至最新的 Windows Mobile 6.5.3(嵌入式手持设备)。以上必须针对基于 Windows CE 6 的操作系统版本进行修改。

问候

约瑟夫

于 2012-11-03T06:42:05.127 回答