2015-12-31 14 views
7

Có một số điều (codeproject, blog1, blog2, forum) để sử dụng thư viện WinRT vào giao diện điều khiển ứng dụng .Net Framework trong Windows 8.tải thư viện UWP vào NET ứng dụng Khung

Tôi đã thử nó với UWP trong Windows 10. Nhưng không thành công. Tôi vật lộn để biên dịch mà không có lỗi, nhưng nó xảy ra BadImageFormatException trong thời gian chạy.

Đây là những gì tôi đã làm.

  1. Tạo ứng dụng Bảng điều khiển với Khuôn khổ .NET 4.6.1.
  2. Chỉnh sửa tệp .csproj để thêm <TargetPlatformVersion>10.0</TargetPlatformVersion>
  3. Tham khảo ba thư viện như sau.
    • c: \ Program Files (x86) \ Windows Kits \ 10 \ UnionMetadata \ Windows.winmd (thể hiện của Windows Runtime 1.4)
    • c: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETCore \ v4.5.1 \ System.Runtime.WindowsRuntime.dll (hiển thị 4.0.10.0)
    • c: \ Program Files (x86) \ Tham chiếu Assemblies \ Microsoft \ Framework.NETCore \ v4.5.1 \ System.Runtime.InteropServices.WindowsRuntime .dll (hiển thị 4.0.0.0)

Ngược lại với ví dụ về Windows 8, có erro r khi System.Runtime.dll được tham chiếu.

Mã như sau. Lưu ý rằng mã là từ Microsoft forum.

class Program 
{ 
    static void Main(string[] args) 
    { 

     Geolocator locator = new Geolocator(); 
     var status = Geolocator.RequestAccessAsync(); 

     if (status != null) 
     { 
      Console.WriteLine("not null"); 
      Task.Run(async() => 
      { 
       Geoposition pos = await locator.GetGeopositionAsync(); 
       Console.WriteLine(pos.Coordinate.Accuracy); 
      }); 
     } 
     else 
     { 
      Console.WriteLine("null"); 
     } 
     Console.ReadLine(); 
    } 

Biên dịch là OK và not null được hiển thị trong bảng điều khiển. Vì vậy, yêu cầu của thư viện chính nó có vẻ tốt. Nhưng GetGeopositionAsync gây ra BadImageFormatException.

Chi tiết thư ngoại lệ như sau.

ngoại lệ ném: 'System.BadImageFormatException' trong mscorlib.dll

thông tin bổ sung: Không thể tải tập tin hoặc lắp ráp 'System.Runtime.WindowsRuntime, Version = 4.0.10.0, Văn hóa = trung tính, PublicKeyToken = b77a5c561934e089 'hoặc một trong các phụ thuộc của nó. Tham chiếu hội đồng không nên được nạp để thực hiện. Chúng chỉ có thể được tải trong bối cảnh trình tải chỉ Reflection. (Ngoại lệ từ HRESULT: 0x80131058)

Tôi đã cố gắng (1) để thay đổi build cấu hình để x86/x64/AnyCPU (2) và để thiết lập Copy địa phương true cho tất cả các tài liệu tham khảo, nhưng lỗi tương tự xảy ra.

Theo tôi, ngoại lệ này là nói System.Runtime.WindowsRuntime cố gắng tải một số thư viện phụ thuộc nội bộ nhưng tôi không biết nó là gì.

+1

Bạn không thể thực hiện các cụm tham chiếu. Đặt thuộc tính Sao chép cục bộ thành Sai và sử dụng Xây dựng> Làm sạch. Nhấn F5 và bây giờ bạn thấy vấn đề thực sự, bạn không có phiên bản 4.0.10.0 của các hội đồng này trên máy của bạn. DLL Hell gõ cửa của bạn, đó không phải là bất thường của khóa học. Nên được lấy từ Nuget nhưng điều đó sẽ không làm việc, hoặc sai vị dự án. Sử dụng các hội đồng tham chiếu từ 4.5 hoạt động tốt trên máy tính của tôi. –

+0

@HansPassant // thanks, tiếp theo là câu trả lời và bình luận của bạn, tôi đã thay đổi Copy Local thành 'false' và Clean project làm cho nó hoạt động. – Youngjae

Trả lời

8

Dưới đây là các bước làm việc trên đây, lưu ý sự khác biệt tinh tế giữa bạn:

Bước 1: Thêm vào.csproj nộp

<PropertyGroup> 
    <TargetPlatformVersion>10.0</TargetPlatformVersion> 
    </PropertyGroup> 

Bước 2: Thêm tham chiếu đến

C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd 

Bước 3: Thêm tham chiếu đến

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll 

Lưu ý sự khác biệt, v4.5 thay vì v4. 5.1 và không có tham chiếu đến System.Runtime.InteropServices.WindowsRuntime.dll.

Điều này hoạt động tốt ở đây (Win10, VS2015).

Side lưu ý, hãy gọi đến Geolocator sẽ thất bại bất kể:

This operation is only valid in the context of an app container. (Exception from HRESULT: 0x8007109A) 

Nó sẽ không có sẵn từ bên trong máy tính để bàn, only types referenced here are supported in desktop.

1

Tôi có lỗi này và tôi đã nâng cấp phiên bản của Microsoft. NETCore.UniversalWindowsPlatform từ "5.0.0" đến "5.2.2" và chương trình của tôi bắt đầu hoạt động

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