3

我正在尝试移植 Mono.Cecil 以在Windows Mobile 6设备上使用 .NET CompactFramework 3.5。首先,我必须对 Mono.Cecil 的源代码进行一些奇怪的调整(来自其 GitHub页面,提交:ec2a54fb00)。试图理解为什么需要这些调整让我有点惊讶。

第一个变化: Mono.Cecil 的源代码有表达式,对 System.Array 类型的对象调用“IsNullOrEmpty()”方法。但是,这种方法在微软实现的.NET框架中根本不存在。因此,代码无法编译。因此,我向 System.Array 类添加了一个扩展方法:

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 应用程序。

我是不是哪里出错了?

PS:但是,使用我在上面构建的 Mono.Cecil DLL 文件,我能够浏览CIL代码并检查它的不同方面。

4

1 回答 1

1

我假设您构建的 Mono Cecil 仍在引用完整的框架系统程序集,因此不会加载到 Compact Framework 程序集中。

当我将 iTextSharp 移植到紧凑框架时,我在一个 Visual Studio 会话中打开了 iTextSharp 源代码,并在另一个新的紧凑框架 (C# SmartDevice) 项目会话中启动了一个新的 iTextSharpCF。

然后,我在新的 Compact Framework 项目中添加了所有代码文件和子目录,因为它们已加载到原始完整框架项目中。

复制完所有文件后,我必须添加在 Compact Framework 项目中使用的相应 Compact Framework 程序集。

然后尝试编译 Compact Framework 版本并重写或添加代码以使 Compact Framework 项目构建成功。最后,您将获得一个仅引用 Compact Framework 程序集并将在智能设备上运行的 Compact Framework 程序集。

MS 构建系统不是那么灵活,您可以将完整的框架项目切换到 Compact Framework 项目,只需设置编译器指令即可。

于 2013-02-23T06:15:11.100 回答