2009-09-05 1 views
8

.NET CF에는 매우 유용한 Reflection.Emit가없는 것 같습니다. 지금까지이 라이브러리를 대안으로 찾았습니다 : http://www.codeplex.com/EmitCF.Reflection.Emit Compact Framework에 대한 대안

그러나 버려진 초기 버전 인 것으로 보이므로 더 많은 옵션을 찾고 있습니다.

누군가 Emit에 대한 다른 대안을 알고 있습니까? 또는 누군가 EmitCF를 사용했으며 상태를 언급 할 수 있습니까?

BTW, 더 큰 그림 : 나는이 CF에서 작동하는 http://dynamic.codeplex.com를 얻을 수 있도록 CF에 대한 방출을 얻으려고, 그래서 내가 (http://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx)

+1

XML에 대한 직렬화는 엄격한 요구 사항입니까? 그렇지 않다면 prot-buf와 같은 것으로 바이너리 직렬화를 볼 수있다. – ctacke

+0

예, 텍스트 기반 직렬화가 필요합니다. 필자는 데이터를 내 프로그램의 새 버전으로 쉽게 마이그레이션 할 수 있는지 확인하는 유일한 방법입니다. – Hermit

답변

5
을 사용하고 직렬화 코드를 최적화 할 수 있습니다

Crom 형식의 프로그램과 라이브러리를 생성하고 검사하는 Mono 프로젝트 라이브러리 인 Cecil (http://mono-project.com/Cecil)이 필요합니다. 그것은 적극적으로 유지 보수되고 Reflection.Emit보다 훨씬 더 많은 일을합니다. .NET CF를 대상으로하는 프로젝트를 포함하여 많은 프로젝트에서 사용됩니다.

+0

EmitCF는 Cecil을 기반으로합니다 ... 세실 (Cecil)을 자세히 살펴 보겠습니다. 좋은 생각입니다. 제가 찾을 수있는 Cecil의 최신 버전은 2007 년부터 0.6입니다. 최신 버전이 있습니까? – Hermit

+0

Cecil은 Mono 코어로 옮겨 졌으므로 최신 버전은 Mono 클래스 라이브러리와 함께 배포됩니다. 소스는 http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/Mono.Cecil/에 있으며 Mono를 다운로드하면 Mono.Cecil.dll이 포함됩니다. –

1

이것은 정확히 귀하의 질문에 대한 답변이 아니지만 Reflection.Emit가 CF에서 지원되지 않기 때문에 직렬화/역 직렬화에 대한 다른 방법은 클래스를 일반 Windows 응용 프로그램으로 컴파일하는 것입니다. Reflection.Emit를 사용하여 각 클래스에 대한 메소드를 직렬화 및 비 직렬화를 프로그래밍 방식으로 생성 한 다음 CF 버전의 클래스에 다시 통합 할 수 있습니다. 기본적으로 코드 생성을위한 전체 프레임 워크에서 Reflection.Emit을 사용합니다.

이것은 더 많은 작업 (물론 더 많은 작업을 계속하는 소스)이지만 역동적 인 Reflection.Emit 기반 접근법 (CF에서는 작동하지 않음)보다 성능이 우수합니다. 대부분의 CF 클래스는 물론 전체 프레임 워크에서 변경되지 않습니다.

+0

위대한 아이디어, 그것이 작동한다면 이상적인 해결책을 만들 것입니다 :-) 나는 그것을 구현하는 방법에 대해 잘 모르겠습니다. 메소드를 클래스에 다시 통합하는 방법에 대해 자세히 설명해 주시겠습니까? 또한이 기술을 사용하는 모든 프로젝트에 대해 알고 있습니까? 예로서 사용할 수 있습니까? – Hermit

+0

Reflection을 조금 들여다 보면, 내가 제안한 것을 할 필요가 없다는 것을 깨달았습니다. 모든 필드와 속성 (Type.GetFields 및 Type.GetProperties 사용)을 반복하고 사용자 지정 Serialize 및 Deserialize 메서드를 생성 한 다음 원본 클래스에 복사하여 붙여 넣을 코드 생성기를 제안했습니다. 결과적으로 Reflection.Emit을 사용할 필요가 없으므로 CF 클래스의 사용자 정의 Serialize 및 Deserialize 메서드에서이 반복을 동적으로 수행 할 수 없습니다. – MusiGenesis

+0

당신은 매개 변수로 Object를 취하고 직렬화 된 것들을 (Serialize를 위해) 돌려 주거나 직렬화 된 조각을 받아 Object를 반환하는 (Decerialize를 위해) Serialize와 Deserialize static 메쏘드로 generic 클래스를 작성할 수도 있습니다. GetFields 및 GetProperties (FieldInfo 및 PropertyInfo 클래스와 함께)는 사용자 지정 프레임 워크에서 사용할 수 있습니다.원하는대로 XML이나 바이트 배열로 직렬화 할 수도 있습니다.하지만 앞으로의 클래스 변경 사항을 처리하기 위해 XML을 사용하는 것이 좋습니다. – MusiGenesis