2014-12-04 2 views
0

Я намеревался реализовать библиотеку Manzana.dll, чтобы обнаруживать события подключения iPhone и взаимодействовать с устройством. Проблема в том, что он работает только в том случае, если на клиентской машине установлены DLL и ресурсы iTunes, на которые я не могу положиться. Поэтому я пытаюсь использовать пользовательскую реализацию исходного кода Manzana, чтобы указать ссылки на необходимые файлы iTunes, которые я включаю в проект.пользовательская реализация iTunesMobileDevice.dll throws NullReferenceException

Хотя все выглядит нормально, скомпилированная библиотека генерирует исключение NullReferenceException при использовании из моего приложения. Загрузка приложения и инициализация в порядке, но когда подключен iPhone, связанное событие выдает исключение.

Фактическая ошибка:

System.TypeInitializationException: The type initializer for 'istreamwrapper.MobileDevice' threw an exception. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
at istreamwrapper.MobileDevice..cctor() 
--- End of inner exception stack trace --- 
at istreamwrapper.MobileDevice.AMDeviceNotificationSubscribe(DeviceNotificationCallback callback, UInt32 unused1, UInt32 unused2, UInt32 unused3, Void*& am_device_notification_ptr) 
at istreamwrapper.iPhone.doConstruction() 

Я был в состоянии использовать это, чтобы сузить проблему этому методу из моего класса iPhone

private unsafe void doConstruction() 
    { 
     void* voidPtr; 
     this.dnc = new DeviceNotificationCallback(this.NotifyCallback); 
     this.drn1 = new DeviceRestoreNotificationCallback(this.DfuConnectCallback); 
     this.drn2 = new DeviceRestoreNotificationCallback(this.RecoveryConnectCallback); 
     this.drn3 = new DeviceRestoreNotificationCallback(this.DfuDisconnectCallback); 
     this.drn4 = new DeviceRestoreNotificationCallback(this.RecoveryDisconnectCallback); 
     int num = MobileDevice.AMDeviceNotificationSubscribe(this.dnc, 0, 0, 0, out voidPtr); 
     if (num != 0) 
     { 
      throw new Exception("AMDeviceNotificationSubscribe failed with error " + num); 
     } 
     num = MobileDevice.AMRestoreRegisterForDeviceNotifications(this.drn1, this.drn2, this.drn3, this.drn4, 0, null); 
     if (num != 0) 
     { 
      throw new Exception("AMRestoreRegisterForDeviceNotifications failed with error " + num); 
     } 
     this.current_directory = "/";    
     } 
    } 

Проблема происходит от

num = MobileDevice.AMDeviceNotificationSubscribe(this.dnc, 0, 0, 0, out voidPtr); 

, который указывает на код, который находится в моем классе MobileDevice

[DllImport("iTunesMobileDevice.dll", CallingConvention = CallingConvention.Cdecl)] 
    public static unsafe extern int AMDeviceNotificationSubscribe(DeviceNotificationCallback callback, uint unused1, uint unused2, uint unused3, out void* am_device_notification_ptr); 

Это, в свою очередь, кажется, ссылаться на это в своем собственном классе

namespace istreamwrapper 
{ 
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
internal delegate void DeviceNotificationCallback(ref AMDeviceNotificationCallbackInfo callback_info); 
} 

, который затем указывает на другой класс с:

namespace istreamwrapper 
{ 
[StructLayout(LayoutKind.Sequential, Pack = 1)] 
internal struct AMDeviceNotificationCallbackInfo 
    { 
    internal unsafe void* dev_ptr; 
    public NotificationMessage msg; 

    public unsafe void* dev 
    { 
     get 
     { 
      return this.dev_ptr; 
     } 
    } 
    } 
} 

Подавляющее большинство этого кода была скопирована прямо из Manzana.dll, единственное, что я изменил, это то, где находятся файлы itunesmobiledevice (который теперь является установленным путем, скорее обнаруженным во время выполнения)

Старый код:

namespace Manzana 
{ 
    internal class MobileDevice 
    { 
private static readonly FileInfo iTunesMobileDeviceFile = new FileInfo(Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Apple Inc.\\Apple Mobile Device Support\\Shared", "iTunesMobileDeviceDLL", (object) "iTunesMobileDevice.dll").ToString()); 
private static readonly DirectoryInfo ApplicationSupportDirectory = new DirectoryInfo(Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Apple Inc.\\Apple Application Support", "InstallDir", (object) Environment.CurrentDirectory).ToString()); 
private const string DLLName = "iTunesMobileDevice.dll"; 

static MobileDevice() 
{ 
    string str = MobileDevice.iTunesMobileDeviceFile.DirectoryName; 
    if (!MobileDevice.iTunesMobileDeviceFile.Exists) 
    { 
    str = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles) + "\\Apple\\Mobile Device Support\\bin"; 
    if (!File.Exists(str + "\\iTunesMobileDevice.dll")) 
     str = "C:\\Program Files\\Common Files\\Apple\\Mobile Device Support"; 
    } 
    Environment.SetEnvironmentVariable("Path", string.Join(";", new string[3] 
    { 
    Environment.GetEnvironmentVariable("Path"), 
    str, 
    MobileDevice.ApplicationSupportDirectory.FullName 
    })); 
} 

Новый код:

namespace istreamwrapper 
{ 
class MobileDevice 
{ 
    static MobileDevice() 
    { 

     string str = "[XX_MYPATHHERE_XX]\\Apple\\Mobile Device Support"; 
     string AppSuppDirectory = @"[XX_MYPATHHERE_XX]\Apple\Apple Application Support"; 
     Environment.SetEnvironmentVariable("Path", string.Join(";", new string[3] { Environment.GetEnvironmentVariable("Path"), str, AppSuppDirectory })); 

    } 

Есть ли что-то я пропускаю, что вызывает этот призыв вернуть нуль? Я признаю, что не полностью понимаю все, что происходит в приведенном выше коде, поэтому вполне возможно, что это что-то простое.

+0

Собственно, я, возможно, решил это. Я не мог понять, почему он выбрасывает исключение null, но я вытащил этот код и протестировал его отдельно, и он дал мне dllnotfound ошибку, что намного более полезно. Я изменил путь и завтра проверил, чтобы решить, разрешило ли оно это. – Chris2222000

+0

Я тоже ищу то же самое, что вы можете мне помочь ... –

ответ

0

Да, я считаю, что ответ был действительно тем, что путь был неправильным и, следовательно, не смог найти файл. Я просто не понимал этого, потому что ошибка, которую он бросала, была слишком общей.