3

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 코드를 탐색하고 다양한 측면을 검사 할 수 있습니다.

답변

1

작성한 Mono Cecil은 전체 프레임 워크 시스템 어셈블리를 계속 참조하므로 Compact Framework 어셈블리로로드되지 않습니다.

iTextSharp를 컴팩트 한 프레임 워크로 포팅하면서 하나의 Visual Studio 세션에서 iTextSharp 소스 코드를 열고 다른 새로운 Compact Framework (C# SmartDevice) 프로젝트 세션에서 새로운 iTextSharpCF를 시작했습니다.

그런 다음 원래의 전체 프레임 워크 프로젝트에서로드 된 새 Compact Framework 프로젝트의 모든 코드 파일과 하위 디렉터리를 추가했습니다.

모든 파일을 복사 할 때 Compact Framework 프로젝트에서 사용되는 해당 Compact Framework 어셈블리를 추가해야했습니다.

그런 다음 Compact Framework 버전을 컴파일하고 다시 작성하거나 코드를 추가하여 Compact Framework 프로젝트 빌드를 성공적으로 완료하십시오. 마지막으로 Compact Framework 어셈블리 만 참조하고 스마트 장치에서 실행되는 Compact Framework 어셈블리를 얻습니다.

MS 빌드 시스템은 컴파일러 지시문을 설정하기 만하면 전체 프레임 워크 프로젝트를 Compact Framework 프로젝트로 전환 할 수있는 유연성이 없습니다.

+0

사실, CompactFramework 용 Mono.Cecil 빌드를 시작할 때 Visual Studio 2008 IDE에서 새로운 C# "스마트 장치 프로젝트"를 시작하고 zip 파일로 다운로드 한 모든 Mono.Cecil 파일을 추가했습니다. GitHub. 프로젝트를 빌드하는 데 사용 된 정확한 명령을 보여주는 출력 창을 살펴 봄으로써 전체 프레임 워크가 아니라 CompactFramework 어셈블리에 대해 빌드가 진행되고 있음을 확인했습니다. 이 명령에는 csc.exe, 참조 된 어셈블리, 소스 코드 파일 및 정의 된 기호가 포함됩니다. 그러므로 제가 생각하기에, 당신이 여기에 적용하는 추론은 배제됩니다. – ghd

+0

또한 필자는 필자의 저의 글에서 필자가 CompactFramework 프로젝트 (Smart Device Projects)에서 Mono.Cecil 라이브러리 (DLL)를 사용하여 어셈블리를 읽고 형식, 메서드, 메서드 본문, 지침 등을 탐색 할 수있었습니다. 등을 제외하고. 어셈블리를 작성하고 라이브러리가 실패하는 경우에만 - 새롭게 작성된 어셈블리가 유효한 Pocket PC 응용 프로그램으로 인식되지 않습니다. – ghd

+0

+1 .NET 전체 프레임 워크를 목표로하는 프로젝트를 Visual Studio IDE를 사용하여 Compact Framework를 대상으로하는 프로젝트로 변환하려고 할 때의 함정을 제안합니다. – ghd