Are there any libraries available for VB.net which will enable me to easily access a MTP device? I'd like to be able to find out what devices are connected, list the contents of them and copy files to and from them.
Everything I've seen so far (either at Stack Overflow, on the Microsoft site or with a simple Google search) is either in C++, C# or some other language that isn't VB.net. The Microsoft documentation goes completely over my head.
As a result, it's all non-starter unless I plan to learn a new language.
I did find MTPSharp which gave me hope. However there is no documentation, it doesn't appear to be fully implemented, my attempts to do certain things return an exception and the author tells me that it's written against an old API I shouldn't use and is unable to help me with the questions I have.
Is there really no hope for someone who wants to use VB.net?
A Window Portable Device Class Lib
Note: this is the work of Christophe Geers from a series of blogs which can be found here
I mainly added a few functions, a VB console test, and converted it to a Class Lib. I tweaked a few things in the code to streamline it, but they are not worth further mention.
Documentation:
Study Mr Geers' blog.
Visual Studio's IntelliSense will also be valuable in identifying the properties and methods available.
Important Notes
Caveat
I have very few portable devices (and cant find one), so testing was rather limited.
Files and Folders
The term
File
andFolder
in this context can be misleading.As the article makes clear, there is a
PortableDeviceObject
type (class) from which bothPortableDeviceFile
andPortableDeviceFolder
inherit.PortableDeviceObject
has a property collection namedFiles
, but that collection actually containsPortableDeviceObject
s. Any one of the items in that collection may in fact be another folder.I started to implement a Folders collection as well, then figured out why it is the way it is. Since a folder can contain sub-folders, it would be more confusing and problematic to link files to subfolders to folders to a PortableDevice. So, I left it.
This means each item in the
Files
collection must be tested to see whether it is really aFile
or aFolder
. This would typically be done one of two ways:To make things slightly simpler and more object oriented, I added an
IsFile
andIsFolder
function toPortableDeviceObject
which allows:There is also a method which returns an
ItemType
enum value (there is also a static version which may be useful):Resources
Mr Geers' original source
Another C# Project for WPD which may be useful
MSDN Windows Portable Devices documentation for more information when you get ready to make mods later.
A VB Console app (just a translation) shows how to use some of the functions. Study the blog fr details.
The code is long, would largely duplicate Mr Geers' blog, and I am disinclined to post code which is not mine. Besides, C# code would apparently do you little good if you can't compile it to a DLL. So, to answer the question posed, Are there any libraries available for VB.net which will enable me to easily access a MTP device?:
Yes. The modified source, project files (VS2012), a new VB console test app and Binaries (
PortableDevices.dll
) can be downloaded from DropBox. The bin/compile folders includes Builds for AnyCPU/Release and x86/ReleaseInterop.*
DLLs located in those folders with thePortableDevice.DLL
. For instance, copy them both along with the DLL to your tools directory. I am not sure why he did it that way.PortableDevice.DLL
.Of course, with the project source files you can load it and recompile to whatever format you desire. VS compiles C# projects the same way you do in VB.
Works on My MachineTM
Again, to be clear, this is not my work. I mainly compiled it to DLL.