2008-10-25 38 views
11

Tôi đang cố gắng biên dịch mã từ F # để sử dụng trong Silverlight. Tôi biên dịch với:Silverlight xác định hội đồng là "Silverlight" như thế nào?

--noframework --cliroot "C: \ Program Files \ Microsoft Silverlight \ 2.0.31005.0" --standalone

này tạo ra một hội đồng độc lập tham chiếu đến khuôn khổ SL. Nhưng khi tôi cố gắng thêm tham chiếu đến hội đồng được tạo, tôi nhận được lỗi này:

You can only add project references to other Silverlight projects in the solution.

Plugin VS làm gì để xác định đây không phải là một hội đồng Silverlight? Đây là tệp kê khai:

// Metadata version: v2.0.50727 
.assembly extern mscorlib 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       // |.....y. 
    .ver 2:0:5:0 
} 
.assembly FSSLLibrary1 
{ 

    // --- The following custom attribute is added automatically, do not uncomment ------- 
    // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = (01 00 01 01 00 00 00 00) 

    .hash algorithm 0x00008004 
    .ver 0:0:0:0 
} 
.module 'F#-Module-FSSLLibrary1' 
// MVID: {49038883-5D18-7281-A745-038383880349} 
.imagebase 0x00400000 
.file alignment 0x00000200 
.stackreserve 0x00100000 
.subsystem 0x0003  // WINDOWS_CUI 
.corflags 0x00000001 // ILONLY 
// Image base: 0x04120000 

Tôi không hiểu những gì nó thấy không thích; đó là IL có thể kiểm chứng được. Tôi so sánh với một SL "thư viện lớp" lắp ráp, và nó trông giống nhau. Sự khác biệt duy nhất là một số thuộc tính, nhưng tôi đã xóa chúng và VS vẫn cho phép tôi tham khảo DLL. Tôi thậm chí còn thêm IL không thể xác minh vào thư viện "SL thư viện" và nó vẫn được tải.

Mọi đề xuất?

Cập nhật: Tôi đã thực hiện một số xung quanh và dường như không phải là tệp kê khai quan trọng. Nó không giống như một cái gì đó trong IL từ các thư viện FSharp. Chúng có thể chữa được, nhưng một cái gì đó trong đó đang kích hoạt sự từ chối.

+0

Nếu bạn có câu trả lời, xin đừng quên chia sẻ nó với chúng tôi. Tôi cũng muốn biết điều này. Cảm ơn! – chakrit

+0

giống như ở đây, tôi yêu F # –

+0

Tôi chắc chắn sẽ đăng nó nếu tôi tìm ra: P – MichaelGG

Trả lời

7

Trả lời!

Rõ ràng vấn đề là khi bạn thêm tham chiếu vào bin \ Release hoặc bin \ Debug, Visual Studio (hoặc hệ thống dự án Silverlight) quyết định cố tham khảo dự án. Điều này không thành công vì bất kỳ lý do gì.

Nếu bạn sao chép F # đầu ra DLL đến một vị trí khác, sau đó tham chiếu đi qua tốt. (Đây sẽ là tham chiếu tệp, không phải là tham chiếu dự án, tất nhiên.)

Sau đó thiết lập phụ thuộc sao cho thư viện F # xây dựng trước, sau đó bạn có thể sử dụng tham chiếu tệp để nhận nhị phân F #.

Cập nhật: Một vấn đề rõ ràng hơn. Nếu tôi bật tối ưu hóa mã, sau đó tôi nhận được lỗi này:

C:\test\SilverlightApplication1\FSC(0,0): error FS0193: internal error: the module/namespace 'System' from compilation unit 'mscorlib' did not contain the namespace, module or type 'MarshalByRefObject' 

Nếu tôi giữ mã tối ưu hóa, điều này biến mất và mọi thứ hoạt động tốt.

+0

Tôi không thể chờ đợi để dùng thử! –

0

Visual Studio sử dụng hàm IsSilverlightAssembly() trong loại Microsoft.VisualStudio.Silverlight.SLUtil để kiểm tra xem có thể đặt tham chiếu hay không.

David Betz có một bài đăng trên blog đẹp mô tả chi tiết here.

+0

Rõ ràng nó làm nhiều hơn một chút so với bên trong VS, vì việc di chuyển tệp ra khỏi vị trí đích làm VS nhìn thấy nó như là một bộ phận SL - cùng một bit mà nó đã thấy là không-SL trước đây. Mặc dù, có lẽ đây là logic khác có nội dung "tham chiếu tệp tới đường dẫn đầu ra -> tham chiếu dự án". – MichaelGG

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