2009-09-05 5 views
15

기능, 사용 편의성, 문서, 샘플, 커뮤니티/지원, VS 통합, 알려진 구현, 장기 실행 가능성 및 사용자 정의 AOP 프레임 워크를 구현하기위한 속도를 구축 하시겠습니까?AOP 프레임 워크 구현을위한 Mono Cecil 대 PostSharp Core vs. Microsoft CCI

내가 알고 시작하자

(난 단지 PostSharp을 시도하는 지금까지) :

  • Microsoft 공용 컴파일러 Instrastruture (CCI) : 나는 가의 FxCop에 사용되는 읽었습니다 , ILMerge, SpeC# 및 코드 계약. 매우 낮은 수준 인 것 같습니다 as it does not even take care of correcting offsets for branch codes that are borken when IL is modified with it.
  • PostSharp 개발, 소스 코드를 사용할 수, 5 세이다 (당신이 떨어져 IL 수동으로 할 해야 할 필요가있을 것이다 예를 들어 초록 몇 가지) AOP에 대한 많은 기능이/단 한 사람에 의해 지원 하지만 그는이 사업을 계획이다, 문서를 가지고 있지만 더 좋을 수 걸릴 빌드 두 배 정도 길고, IL 를 주입하고, 버전 2.0이 곧 많이 될 것을 약속 발매 예정 방법에 대한 매우 작은 샘플 개선.
  • 모노 세실 : 한 사람에 의해 작성된 모노 제품군의 일부 과 플러그인이 반사판에 대한이 모노 세실를 사용 Reflexil 을했다.

답변

6

Microsoft.CCI와 Mono.Cecil은 모두 하위 수준이며 생성 된 어셈블리의 유효성을 검사하지 않습니다. 생성 된 코드 또는 어셈블리 구조에 오류가있는 경우 문제의 원인을 찾는 데 많은 시간이 걸립니다.
PostSharp를 사용하면 기능이 충분하여 작업을 수행하는 것이 좋습니다.
그렇지 않으면 ... Mono.Cecil은 더 잘 이해할 수 있고 사용하기 쉬운 개체 모델을 가지고 있습니다. 그러나 내 프로그램에서 사용할 때 못생긴 버그가 발생했습니다 (잘못된 메서드에 대한 참조가 어셈블리에 저장되었으므로 메타 데이터 토큰 처리에 버그가있는 것으로 생각됩니다)
Microsoft.CCI는 완전히 이상한 디자인의 개체가 있습니다 같은 시간에 많은 간단한 기능이 부족한 모델; 하지만 모노보다 성숙해. 세실. 마지막으로, 나는 Mono를 버렸습니다 .Cecil은 Microsoft 프로그램을 위해 Microsoft.CCI를 사용했습니다.

+0

경험을 공유해 주셔서 감사합니다! PEVerify Tool을 사용하여 생성 된 어셈블리의 유효성을 검사 할 수 있다고 생각합니다. 나는 지금 PostSharp를 사용하고 있으며, 지금까지 원했던 모든 것을 할 수있었습니다. (그리고 그 이유를 찾는 것이 옳았습니다. 매우 좌절 할 수 있습니다 ...). 더 성숙한 무엇을 의미합니까? 더 적은 버그? PostSharp를 사용하지 않는 특별한 이유가 있습니까? 호기심에서, 당신의 프로그램은 무엇을하고 있습니까? –

+0

내 프로그램은 어셈블리 합병/수축기이므로 PostSharp는 저에게 도움이되지 않았습니다. 그리고 예, Microsoft.CCI의 버그가 덜 발견되었으며, 더 많은 CLI 기능 (예 : 혼합 어셈블리)을 지원합니다. 그러나 객체 모델은 실제로 사용하기가 어렵습니다. 생성 된 어셈블리를 확인하기 위해 PEVerify를 사용했습니다. 그러나 성공하지 못하면 성공할 수 있는지는 확실치 않습니다.) 그러나 오류는 종종 어셈블리 생성 프로세스를 중단하며 PEVerify는 그러한 경우 쓸모가 없습니다. – skevar7

4

거기에 이미 대부분의 프레임 워크와 마찬가지로, 나는 당신의 자신의 AOP 프레임 워크를 구현에 대해 당신에게 제안 : 하지 마십시오. 상업적으로 지원되는 PostSharp (곧 출시 예정)와 Typemock으로 구동되는 AOP 프레임 워크 인 CThru을 포함하여 이미 여러 가지가 있습니다.

하지만 어쨌든 Mono.Cecil은 사용하기가 매우 쉽습니다. Reflection.Emit을 처리 할 필요성을 추상화하고 Mono 커뮤니티의 지원을받습니다.

LinFu - 오픈 소스 라이브러리 집합이며, 그 중 하나는 Mono.Cecil 위에 구현 된 AOP 프레임 워크입니다. CodeProject의 LinFu AOP에 대한 유용한 기사가 있습니다.

+0

나는 컴파일 타임에 코드를 삽입하는 AOP에만 관심이있다. –

+0

LinFu가 그렇게합니다. IL을 짜기위한 컴파일러 작업이 있습니다. –

+1

LinFu.AOP는 유형을 수정하여 컴파일러 작업 후 코드 삽입을 가능하게하는 IL을 작성하지만, 런타임 동안 성능이 떨어지는 실제 코드가 주입됩니다. –

3

AFAIK, LinFu는 Mono.Cecil을 기반으로합니다.

저는 PostSharp라고 말하고 싶습니다.코어는 다른 프레임 워크보다 더 높은 수준의 기능을 가지고 있으므로 더 큰 작업에는 사용하기가 어렵지 않습니다. 낮은 수준에서도 작업 할 수 있지만 2 진 수준에서는 작동하지 않습니다 (의도적으로). PostSharp를 사용하여 어셈블리 합병/축소기를 수행 할 수 있지만 ILASM을 사용하여 다시 컴파일한다는 사실은 몇 가지 제한 사항을 설정합니다 (예 : 내부 구성원의 이름도 지정해야 함). ILASM을 백엔드로 사용하면 ILASM이 많은 규칙을 검증하고 생성 된 MSIL 코드를 쉽게 읽을 수 있기 때문에 PostSharp의 상단에서 훨씬 쉽게 개발할 수 있습니다. PostSharp는 코드 생성 디버깅을 돕기 위해 MSIL에 주석을 추가 할 수도 있습니다.

또 다른 포인트 : 사용자 지정 측면을 수행하려는 경우 (예 : 데이터베이스 엔진을 개발하고 지속성 측면을 제공하려는 경우) MSIL 다시 작성자 그 이상이 필요합니다. 당신은 당신을 위해 많은 일을 할 수있는 AO 인프라가 필요합니다. 커스텀 애스펙트를 개발할 때, 커스텀 애스펙트에 대한 작업의 1 %, 애스펙트 인프라의 39 %, MSIL 리필러의 60 %가 필요합니다. PostSharp를 기반으로 한 두 시간 만에 매우 특정한면을 프로그램 할 수 있습니다.

그래서 내 질문에 답해 드리겠습니다. 물론 내 자신의 비아스에 대해서도 말하고 싶습니다. obfuscator, Merger/shrinker 등을 쓰고 싶다면 Mono.Cecil 또는 Microsoft.CCI로 PostSharp의 라이센스보다 더 친숙한 면허를 취득해야합니다. 그러나 PostSharp를 사용하여 사용자 정의 영역을 개발하려는 경우 을 저장하게되며 PostSharp를 재배포 할 계획이라면 상업적 조건에 놀랄 것입니다.

+0

좋은 소리. PostSharp를 계속 사용할 것 같아요. 지금까지 그걸로 행복하게 해왔어요. –