8

Tôi có một ứng dụng FM Radio Tuner đơn giản trong Silverlight 5 Out-of-browser gọi mã từ một Native C++ DLL từ USB FM Receiver của tôi bằng PInvoke. Ứng dụng này hoạt động rất tốt trong Windows 8 với Silverlight5.PInvoke trong Metro Apps với Windows 8/WinRT

Bây giờ tôi đang cố gắng chuyển nó đến Ứng dụng Metro bằng cách sử dụng WinRT.

Việc di chuyển từ giao diện người dùng Silverlight sang XAML khá dễ dàng và hoạt động tốt. Các chữ ký PInvoke và các thuộc tính đã được phát hiện tốt với không gian tên System.Runtime.InteropServices và thuộc tính DLLImport.

Vấn đề là khi tôi đang chạy App và gọi bất kỳ phương pháp từ DLL bản địa PInvoked rằng đã từng làm việc trong ứng dụng SL5 của tôi (mà hoạt động tốt ngay cả trên Windows8), tôi có ngoại lệ này:

System.DllNotFoundException was unhandled by user code 
    Message=Unable to load DLL 'CarTFTFM.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E) 
    Source=metroradio 
    TypeName="" 
    StackTrace: 
     at MetroRadio.FMRadio.HWInit2(Int32 port, Int32 initVolume) 
     at MetroRadio.MediaService.InitializeRadio() in c:\Users\Gutemberg\Documents\Visual Studio 11\Projects\MetroRadio\MetroRadio\MediaService.cs:line 160 
     at MetroRadio.MainPage.radio_Click(Object sender, RoutedEventArgs e) in c:\Users\Gutemberg\Documents\Visual Studio 11\Projects\MetroRadio\MetroRadio\MainPage.xaml.cs:line 43 
    InnerException: 

Vì vậy, câu hỏi của tôi là, vấn đề trên PInvoke này là gì? Kể từ khi nó hoạt động tốt trên Windows8 với một ứng dụng SL5, tôi không thấy bất kỳ lý do để có vấn đề với WinRT/Metro Apps.

+1

Âm thanh như DLL bị thiếu trong tệp kê khai gói. Tài liệu hiện tại quá tối nghĩa để cung cấp liên kết tốt. –

+0

Hãy xem câu hỏi này: http://stackoverflow.com/questions/7807361/how-to-p-invoke-to-a-native-dll-from-metro –

+0

Âm thanh tương tự nhưng vẫn không thành công ... –

Trả lời

5

Theo Pavel Minaev 's trả lời cho câu trả lời Chris Pietschmann của:

P/Invoke và COM Interop chắc chắn nhất hỗ trợ cho các ứng dụng .NET Metro. Win32 API cũng được hỗ trợ và có thể được gọi thông qua các công nghệ trên, mặc dù giới hạn các chức năng có sẵn cho ứng dụng Metro (ví dụ: nếu ứng dụng Metro C++ không thể gọi nó, không thể ứng dụng .NET).

Như Morten Frederiksen điểm ra, nó là tuy nhiên nhiều khả năng CarTFTFM.dll chứa một bộ phận không được hỗ trợ của bề mặt Win32 API cho WinRT:

Chỉ có một tập hợp con của Win32 và COM API được hỗ trợ: msdn.microsoft.com/en-us/library/windows/apps/br205757

1

Trừ khi đó là hệ thống DLL hoặc định vị khác thông qua đường dẫn hệ thống, bạn cần đảm bảo rằng DLL của bạn được sao chép vào cùng một thư mục như ứng dụng Metro của bạn được triển khai.

tôi giải quyết vấn đề bằng cách thêm các DLL nguồn gốc từ dự án ứng dụng Metro của tôi, đảm bảo rằng Build Action được thiết lập để ContentCopy to Output mục được thiết lập để Sao chép Luôn hoặc Sao chép nếu đăng Mới hơn.

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