PInvoke в приложениях Metro с Windows 8 / WinRT - PullRequest
8 голосов
/ 16 января 2012

У меня есть простое приложение для FM-радио-тюнера в Silverlight 5 вне браузера, которое вызывает код из Native C ++ DLL из моего USB FM-приемника, используя PInvoke.Это приложение очень хорошо работает в Windows 8 с Silverlight5.

Теперь я пытаюсь перенести его в приложение Metro с помощью WinRT.

Переход с Silverlight на пользовательский интерфейс XAML довольно прост и работает хорошо.Сигнатуры и атрибуты PInvoke были обнаружены с помощью пространства имен System.Runtime.InteropServices и атрибута DLLImport.

Проблема заключается в том, что когда я запускаю приложение и вызываю любой метод из собственной библиотеки PInvoked, которая использовалась дляработать в моем приложении SL5 (которое отлично работает даже на Windows8), у меня есть это исключение:

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: 

Итак, мой вопрос, в чем проблема этого PInvoke?Так как он хорошо работает на Windows8 с приложением SL5, я не вижу причин для проблем с приложениями WinRT / Metro.

Ответы [ 2 ]

5 голосов
/ 21 августа 2012

Согласно Ответ Павла Минаева на ответ Криса Питшмана:

P / Invoke и COM Interop наверняка поддерживаются для приложений .NET Metro. Win32 API также поддерживается и может вызываться с помощью вышеуказанных технологий, хотя он ограничен теми функциями, которые доступны для приложений Metro (т. Е. Если приложение C ++ Metro не может вызвать его, равно как и приложение .NET).

Как указывает Мортен Фредериксен , вполне вероятно, что CarTFTFM.dll содержит неподдерживаемую часть поверхности Win32 API для WinRT:

Поддерживается только подмножество Win32 и COM API: msdn.microsoft.com / ru-ru / библиотека / windows / apps / br205757

1 голос
/ 25 августа 2012

Если это не системная DLL или иная локализация по системному пути, вам необходимо убедиться, что ваша DLL скопирована в ту же папку, в которой развернуто приложение Metro.

Я решил эту проблему, добавив собственную DLL в проект приложения Metro, установив для Build Action значение Содержимое и Копирование в каталог вывода установлен на Копировать всегда или Копировать, если новее .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...