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

第一个变化:Mono.Cecil的源代码具有在System.Array类型的对象上调用“IsNullOrEmpty()”方法的表达式。但是,这种方法在Microsoft实现的.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应用程序。

我在哪里弄错了?

附注:但是,使用上面构建的Mono.Cecil DLL文件,我可以浏览CIL代码并检查它的不同方面。

最佳答案

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

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

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

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

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

MS构建系统的灵活性不强,您只需设置编译器指令就可以将整个框架项目切换到Compact Framework项目。

关于visual-studio-2008 - 在Windows Mobile设备上将Mono.Cecil与.NET CompactFramework一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15024160/

10-10 13:04