imobiledevice-net is a library which allows you to interact with iOS devices on Windows using any of the .NET Framework languages (such as C# or Visual Basic). It is based on the libimobiledevice library.
You can install imobiledev-net as a NuGet package
PM> Install-Package imobiledevice-net
We've done some work to make sure imobiledevice-net "just works":
- Better string handling: Strings are marshalled (copied from .NET code to unmanaged code and vice versa) as UTF-8 strings. This is what libimobiledevice uses natively.
- Better array handling: In most cases, we'll return a
ReadOnlyCollection<string>
object instead ofIntPtr
objects when the native API returns an array of strings. - Less memory leaks: We give you safe handles instead of
IntPtr
objects. When you dispose of the safe handle (or you forget, and the framework does it for you), the safe memory is freed, too. - Unit testing support: You interact with libimobiledevice through classes such as
iDevice
orLockdown
. For each of these classes, we also expose an interface, allowing you to unit test your code. - XML Documentation: Where possible, we've copied over the documentation of libimobiledevice to imobiledevice-net, giving you IntelliSense support.
We use libclang
to parse the libimobiledevice C headers and generate the C# P/Invoke code.
Before you use the library, you must call NativeLibraries.Load()
so that libimobiledevice
is loaded correctly:
NativeLibraries.Load();
The following snippit lists all devices which are currently connected to your PC:
ReadOnlyCollection<string> udids;
int count = 0;
var idevice = LibiMobileDevice.Instance.iDevice;
var lockdown = LibiMobileDevice.Instance.Lockdown;
var ret = idevice.idevice_get_device_list(out udids, ref count);
if (ret == iDeviceError.NoDevice)
{
// Not actually an error in our case
return;
}
ret.ThrowOnError();
// Get the device name
foreach (var udid in udids)
{
iDeviceHandle deviceHandle;
idevice.idevice_new(out deviceHandle, udid).ThrowOnError();
LockdownClientHandle lockdownHandle;
lockdown.lockdownd_client_new_with_handshake(deviceHandle, out lockdownHandle, "Quamotion").ThrowOnError();
string deviceName;
lockdown.lockdownd_get_device_name(lockdownHandle, out deviceName).ThrowOnError();
deviceHandle.Dispose();
lockdownHandle.Dispose();
}