在我开始之前,让我在任何人建议或提出问题之前澄清任何困惑。
这个问题与“Windows Mobile 6 Professional”有关,而不是 Windows Phone 7,它不能移植到 Windows Phone 7,因为它必须继续使用旧设备。
现在,有了它的出路...
我目前正在尝试移植一个 C# 库,我有该库的源代码可以在 Windows Mobile 6 设备上运行,我已经对这些东西进行了编码,看起来就像永远一样,但是我从来没有处理过一件事,直到现在,这就是反思。
现在每个人都知道 .NET 紧凑型框架确实存在一些限制,似乎缺乏对“System.Reflection”命名空间中的许多方法和属性的支持就是其中之一。
该库的实际桌面版本设置为 .NET V2.0,并且我有运行 .NET 3.5 SP1 的设备,所以在大多数情况下,我在让事情正常工作方面几乎没有问题,但似乎不能找到一个明智的方法来使以下 2 块代码正常工作:
var a = AppDomain.CurrentDomain**.GetAssemblies**();
foreach (var assembly in a)
{
if (assembly is System.Reflection**.Emit.**AssemblyBuilder) continue;
if (assembly**.GetType().**FullName == "System.Reflection.Emit.InternalAssemblyBuilder") continue;
if (assembly**.GlobalAssemblyCache** && assembly**.CodeBase** == Assembly.GetExecutingAssembly()**.CodeBase**) continue;
foreach (var t in GetLoadableTypes(assembly))
{
if (t.IsInterface) continue;
if (t.IsAbstract) continue;
if (t.IsNotPublic) continue;
if (!typeof(IGeometryServices).IsAssignableFrom(t)) continue;
var constuctors = t.GetConstructors();
foreach (var constructorInfo in constuctors)
{
if (constructorInfo.IsPublic && constructorInfo.GetParameters().Length == 0)
return (IGeometryServices)Activator.CreateInstance(t);
}
}
}
和
catch (**ReflectionTypeLoadException** ex)
{
var types = ex**.Types**;
IList<Type> list = new List<Type>(types**.Length**);
foreach (var t in types)
if (t != null && t**.IsPublic**)
list.Add(t);
return list;
}
具体来说,上面代码中的粗体项是紧凑框架中似乎不存在的方法和属性,并且在使用智能感知和对象浏览器花费了大量时间之后,我没有找到任何返回(或提供)相同的类型。
那么我的问题如下:
有没有人有在 Compact .NET 框架中使用反射的经验,并且可以建议如何使此代码按预期工作,或者我将不得不开始编写自定义存根和功能来替换缺少的方法。
我知道框架上有一些反射功能,所以我确信必须有一种等效的方法来实现它。
最后一点,对于任何可能识别代码的人。是的,它来自 .NET 拓扑套件,是的,我正在尝试构建一个 WM6 版本的库,所以如果你知道有人已经做过它,请对此发表评论,我'将去看看更简单的路径:-)
==================================================== =====================
发布后更新
看起来“粗体”文本在代码片段中不起作用,因此上述代码中被 ** 包围的那些方法/属性是应该以粗体显示的部分。