Windows Mobile 6 장치에서 .NET CompactFramework 3.5로 작업하려면 Mono.Cecil을 이식하려고합니다. 첫째, Mono.Cecil (its GitHub 페이지, 커밋 : ec2a54fb00)의 소스 코드에 대해 몇 가지 비법을 수정해야했습니다. 비틀기가 왜 필요한지를 이해하려고 할 때 나에게 조금 놀랍습니다.Windows Mobile 장치에서 .NET CompactFramework와 함께 Mono.Cecil 사용
첫 번째 변경 : Mono.Cecil의 소스 코드에는 System.Array 유형의 개체에 대해 "IsNullOrEmpty()"메서드를 호출하는식이 있습니다. 그러나 이러한 방법은 Microsoft에서 구현 한 .NET Framework에는 전혀 존재하지 않습니다. 이로 인해 코드가 컴파일되지 않습니다. 따라서 I를 System.Array 클래스 확장 수단을 추가 :
static class ArrayExtensions
{
public static bool IsNullOrEmpty(this System.Array a)
{
return a.Length == 0;
}
}
제 2 변화 : Mono.Cecil의 소스 코드를 시도가 선택 System.String 타입의 객체에 대한 "ToLowerInvariant()"메소드를 호출 할. 그러나 이러한 방법은 CompactFramework에는 존재하지 않습니다. 그래서 여기에 두 번째 팅겨입니다 : 여기에 그냥 String 클래스의 "ToLower는"방법 "ToLowerInvariant"방법에 만들어진 호출을 전달하고
static class StringExtensions
{
#if PocketPC
public static string ToLowerInvariant(this String a)
{
return a.ToLower();
}
#endif
}
.
PocketPC
CF
다음, 내가 사용 내장 Mono.Cecil DLL 파일을 테스트하는 데 필요한 :
나는 정의 된 다음 컴파일 기호, 비주얼 스튜디오 2008에서 위의 변경과 Mono.Cecil의 소스 코드를 내장 위의 단계. 내 접근 방식은 어셈블리를 읽고 다른 이름으로 다시 작성하는 것이 었습니다. 이를 위해 Windows 모바일 장치에서 실행되는 간단한 응용 프로그램을 만들고 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 코드를 탐색하고 다양한 측면을 검사 할 수 있습니다.
사실, CompactFramework 용 Mono.Cecil 빌드를 시작할 때 Visual Studio 2008 IDE에서 새로운 C# "스마트 장치 프로젝트"를 시작하고 zip 파일로 다운로드 한 모든 Mono.Cecil 파일을 추가했습니다. GitHub. 프로젝트를 빌드하는 데 사용 된 정확한 명령을 보여주는 출력 창을 살펴 봄으로써 전체 프레임 워크가 아니라 CompactFramework 어셈블리에 대해 빌드가 진행되고 있음을 확인했습니다. 이 명령에는 csc.exe, 참조 된 어셈블리, 소스 코드 파일 및 정의 된 기호가 포함됩니다. 그러므로 제가 생각하기에, 당신이 여기에 적용하는 추론은 배제됩니다. – ghd
또한 필자는 필자의 저의 글에서 필자가 CompactFramework 프로젝트 (Smart Device Projects)에서 Mono.Cecil 라이브러리 (DLL)를 사용하여 어셈블리를 읽고 형식, 메서드, 메서드 본문, 지침 등을 탐색 할 수있었습니다. 등을 제외하고. 어셈블리를 작성하고 라이브러리가 실패하는 경우에만 - 새롭게 작성된 어셈블리가 유효한 Pocket PC 응용 프로그램으로 인식되지 않습니다. – ghd
+1 .NET 전체 프레임 워크를 목표로하는 프로젝트를 Visual Studio IDE를 사용하여 Compact Framework를 대상으로하는 프로젝트로 변환하려고 할 때의 함정을 제안합니다. – ghd