3

WindowsMo ​​bile6デバイスで.NETCompactFramework3.5と連携するようにMono.Cecilを移植しようとしています。まず、Mono.Cecilのソースコードにいくつかの奇妙な調整を加える必要がありました(GitHubページからコミット:ec2a54fb00)。微調整が必​​要な理由を理解しようとすると、少し驚きます。

最初の変更: Mono.Cecilのソースコードには、System.Arrayタイプのオブジェクトに対して「IsNullOrEmpty()」メソッドを呼び出す式があります。ただし、このような方法は、Microsoftが実装している.NETFrameworkにはまったく存在しません。このため、コードはコンパイルされませんでした。したがって、System.Arrayクラスに拡張メソッドを追加しました。

static class ArrayExtensions
{
    public static bool IsNullOrEmpty(this System.Array a)
    {
        return a.Length == 0;
    }
}

2番目の変更: Mono.Cecilのソースコードは、System.String型のオブジェクトに対して「ToLowerInvariant()」メソッドを呼び出そうとします。しかし、そのようなメソッドはCompactFrameworkには存在しません。したがって、2番目の調整は次のとおりです。

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.CecilDLLファイルをテストする必要がありました。私のアプローチは、アセンブリを読み取り、別の名前で再作成することでした。この目的のために、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と呼ばれます。新しいアプリケーションSmartDeviceProject1New.exeをWindowsMo​​bileデバイスで実行しようとすると、実行に失敗します。エラーメッセージは、ファイルが有効なPocketPCアプリケーションではないことを報告します。

私はどこかで間違っていましたか?

PS:ただし、上記で作成したMono.Cecil DLLファイルを使用すると、CILコードをナビゲートして、そのさまざまな側面を調べることができます。

4

1 に答える 1