PInvoke в приложениях Metro с Windows 8 / WinRT

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

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

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

Проблема в том, что когда я запускаю приложение и вызываю любой метод из собственной библиотеки DLL 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 Apps.


person Gutemberg Ribeiro    schedule 16.01.2012    source источник
comment
Похоже, что DLL отсутствует в манифесте пакета. Текущие документы слишком непонятны, чтобы давать хорошую ссылку.   -  person Hans Passant    schedule 16.01.2012
comment
Взгляните на этот вопрос: stackoverflow.com/questions/7807361/   -  person Aleksandr Dubinsky    schedule 16.01.2012
comment
Звучит похоже, но все равно безуспешно ...   -  person Gutemberg Ribeiro    schedule 16.01.2012
comment
Приложениям Metro не разрешено вызывать какие-либо функции Win32. Возможно, DLL использует недопустимый вызов при загрузке (DllMain), что приводит к сбою загрузки. Помните, что это еще даже не бета ...   -  person Emond Erno    schedule 16.01.2012
comment
@GutembergRibeiro Я полагаю, что вы уже нашли способ решить эту проблему, но если нет, пожалуйста, взгляните на мой ответ ниже.   -  person Anders Gustafsson    schedule 25.08.2012


Ответы (2)


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

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 / library / windows / apps / br205757

person lightw8    schedule 20.08.2012

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

Я решил проблему, добавив встроенную DLL в мой проект приложения Metro, убедившись, что для параметра Действие сборки установлено значение Content и что Копировать в выходной каталог установлен на Копировать всегда или Копировать, если новее.

person Anders Gustafsson    schedule 25.08.2012