7

Tôi đang cố gắng thêm hỗ trợ Silverlight vào ngôn ngữ lập trình yêu thích của tôi Nemerle.Bắt các loại trong mscorlib 2.0.5.0 (còn gọi là Silverlight mscorlib) thông qua sự phản chiếu trên?

Nemerle, về thủ tục biên soạn, tải tất cả các loại thông qua phản ánh chủ yếu ở 2 bước

1-) Sử dụng Assembly.LoadFrom để tải lắp ráp 2-) Assembly.GetTypes Usese() để có được các loại

Sau đó, khi kết thúc quá trình biên dịch, nó phát ra các kiểu được giải quyết với Reflection.Emit.

Quy trình này hoạt động đối với tất cả các cụm bao gồm Silverlight ngoại trừ mscorlib của silverlight.

Trong C# này không thành công:

var a = System.Reflection.Assembly.LoadFrom(@"c:\mscorlib.dll"); 

nhưng điều này qua:

var a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"c:\mscorlib.dll"); 

Bu trong trường hợp sau, a.GetTypes() ném một ngoại lệ mẹ sayin System.Object không tồn tại.

Có lối thoát không?

+0

Bạn đang làm điều này từ Silverlight bản thân hoặc CLR tiêu chuẩn? –

Trả lời

5

Giả sử bạn đang cố gắng phản ánh trên mscorlib của Silverlight từ CLR chuẩn, điều này sẽ không hoạt động vì CLR không cho phép tải nhiều phiên bản của mscorlib. (Có lẽ điều này là bởi vì nó có thể làm rối loạn độ phân giải của các loại lõi của nó).

Cách giải quyết là sử dụng Mono.Cecil để kiểm tra các loại: http://mono-project.com/Cecil. Thư viện này thực sự hoạt động tốt hơn so với .NET's Reflection và được cho là mạnh mẽ hơn.

Dưới đây là một số mã để giúp bạn bắt đầu:

AssemblyDefinition asm = AssemblyFactory.GetAssembly(@"C:\mscorlib.dll"); 

var types = 
    from ModuleDefinition m in asm.Modules 
    from TypeDefinition t in m.Types 
    select t.Name; 
1

Bạn có thể biên dịch Nemerle với lắp ráp Silverlight và sau đó bạn đã Nemerle làm việc trên đỉnh của Silverlight :)

Các vấn đề liên quan