我正在尝试将Mono.Cecil移植到Windows Mobile 6设备上的.NET CompactFramework 3.5。首先,我必须对Mono.Cecil的源代码(来自GitHub页面,提交:ec2a54fb00)进行一些奇怪的调整。令我惊讶的是,我试图理解为什么需要这些调整。
第一个更改: Mono.Cecil的源代码包含在System.Array类型的对象上调用“IsNullOrEmpty()”方法的表达式。但是,在Microsoft实现的.NET框架中根本不存在这样的方法。因此,代码无法编译。因此,我向System.Array类添加了一个扩展方法:
接下来,我需要测试使用上述步骤构建的Mono.Cecil DLL文件。我的方法是读取一个程序集并以不同的名称重新创建它。为此,我创建了一个简单的应用程序,可以在Windows Mobile设备上运行,并将其命名为SmartDeviceProject1.exe。我读取与此应用程序对应的程序集,并将其写成不同的名称:
新的程序集名为 SmartDeviceProject1New.exe。当我尝试在 Windows Mobile 设备上运行新应用程序 SmartDeviceProject1New.exe 时,它无法运行。错误消息报告该文件不是有效的 PocketPC 应用程序。
static class ArrayExtensions
{
public static bool IsNullOrEmpty(this System.Array a)
{
return a.Length == 0;
}
}
第二个修改: Mono.Cecil的源代码试图在System.String类型的对象上调用"ToLowerInvariant()"方法。但是,在CompactFramework中不存在这样的方法。因此,这是第二个微调:static class StringExtensions
{
#if PocketPC
public static string ToLowerInvariant(this String a)
{
return a.ToLower();
}
#endif
}
在这里,我只是将对“ToLowerInvariant”方法的调用转发到String类的“ToLower”方法。
我使用Visual Studio 2008构建了Mono.Cecil的源代码,并定义了以下编译符号:
PocketPC
CF
接下来,我需要测试使用上述步骤构建的Mono.Cecil DLL文件。我的方法是读取一个程序集并以不同的名称重新创建它。为此,我创建了一个简单的应用程序,可以在Windows Mobile设备上运行,并将其命名为SmartDeviceProject1.exe。我读取与此应用程序对应的程序集,并将其写成不同的名称:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Forms;
using Mono.Cecil;
namespace SmartDeviceProject3
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[MTAThread]
static void Main()
{
var assemblyDef = AssemblyDefinition.ReadAssembly(@"\Program Files\SmartDeviceProject1\SmartDeviceProject1.exe");
assemblyDef.Write(@"\Program Files\SmartDeviceProject1\SmartDeviceProject1New.exe");
}
}
}
新的程序集名为 SmartDeviceProject1New.exe。当我尝试在 Windows Mobile 设备上运行新应用程序 SmartDeviceProject1New.exe 时,它无法运行。错误消息报告该文件不是有效的 PocketPC 应用程序。
我做错了什么吗?
P.S:然而,使用我上面构建的 Mono.Cecil DLL 文件,我能够浏览 CIL 代码并检查其不同方面。