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をWindowsMobileデバイスで実行しようとすると、実行に失敗します。エラーメッセージは、ファイルが有効なPocketPCアプリケーションではないことを報告します。
私はどこかで間違っていましたか?
PS:ただし、上記で作成したMono.Cecil DLLファイルを使用すると、CILコードをナビゲートして、そのさまざまな側面を調べることができます。