在Visual Basic .NET中访问MTP设备

时间:2014-10-22 18:48:18

标签: vb.net dll mtp

是否有可用于VB.net的库可以让我轻松访问MTP设备?我希望能够找到连接的设备,列出它们的内容并将文件复制到它们之间。

到目前为止我所看到的一切(无论是在Stack Overflow,在Microsoft网站上还是在简单的Google搜索中)都是使用C ++,C#或其他不是VB.net的语言。 Microsoft文档完全超出了我的想法。

因此,除非我打算学习一门新语言,否则它都不是首发。

我确实发现MTPSharp给了我希望。然而,没有文档,它似乎没有完全实现,我做某些事情的尝试返回一个例外,作者告诉我,它是针对我不应该使用的旧API编写的并且无法帮助我解决我的问题。

对于想要使用VB.net的人真的没有希望吗?

3 个答案:

答案 0 :(得分:4)

Window Portable Device类Lib

注意:这是来自一系列博客的 Christophe Geers 的作品,可以是found here

我主要添加了一些函数,VB控制台测试,并将其转换为Class Lib。我在代码中调整了一些内容以简化它,但它们不值得进一步提及。

文档:

学习 Mr Geers' blog

Visual Studio的IntelliSense在识别可用的属性和方法方面也很有价值。

重要说明

<强>买者

我的便携式设备很少(而且找不到便携设备),所以测试相当有限。

文件和文件夹

此上下文中的术语FileFolder可能会产生误导。

正如文章明确指出的那样,PortableDeviceObjectPortableDeviceFile都有PortableDeviceFolder类型(类)。 PortableDeviceObject有一个名为Files的属性集合,但该集合实际上包含PortableDeviceObject个。该集合中的任何一个项目实际上可能是另一个文件夹。

我也开始实现Folders集合,然后弄清楚原因是什么。由于文件夹可以包含子文件夹,因此将文件链接到子文件夹到文件夹到PortableDevice会更加困惑和有问题。所以,我离开了。

这意味着必须对Files集合中的每个项目进行测试,以确定它是真的File还是Folder 。这通常可以通过以下两种方式之一完成:

' using VB operator
If TypeOf item Is PortableDeviceFolder Then
    Console.Beep()
End If

' using NET Type method
If item.GetType Is GetType(PortableDeviceFolder) Then
    Console.Beep()
End If

为了使稍微更简单,更面向对象,我向IsFile添加了IsFolderPortableDeviceObject函数,允许:

If item.IsFolder Then
   DisplayFolderContents(dev, CType(item, PortableDeviceFolder))
End If

还有一个返回ItemType枚举值的方法(还有一个可能有用的静态版本):

' using GetItemType
If item.GetItemType = PortableDeviceObject.ItemTypes.File Then
    Console.Beep()
End If

资源

Geers先生original source

WPD的

Another C# Project可能很有用

MSDN Windows Portable Devices documentation了解更多信息,以便日后准备好制作mod。

VB控制台应用程序(只是翻译)显示了如何使用某些功能。研究博客详情。

代码很长,很大程度上会复制Geers先生的博客,而且我不愿意发布不属于我的代码。此外,如果您无法将其编译为DLL,那么C#代码显然对您没什么好处。那么,为了回答提出的问题,是否有可用于VB.net的库,这使我可以轻松访问MTP设备?

是。修改后的源代码,项目文件(VS2012),新的VB控制台测试应用和二进制文件(PortableDevices.dll)可以是downloaded from DropBox。 bin / compile文件夹包括Build for AnyCPU / Release和x86 / Release

  • 您希望将Interop.* DLL保存在PortableDevice.DLL这些文件夹中。例如,将它们与DLL一起复制到工具目录中。我不确定他为什么这样做。
  • 要在项目中使用新的类库,您显然需要添加对全新PortableDevice.DLL的引用。

当然,使用项目源文件,您可以加载它并重新编译为您想要的任何格式。 VS以与在VB中相同的方式编译C#项目。

enter image description here

适用于我的机器 TM

再次,要清楚,这不是我的工作。我主要把它编译成DLL。

答案 1 :(得分:1)

(这应该是对this answer的评论,但我没有足够的声誉来添加评论)

@理查德说:

当我运行C#代码时,我在第107行收到一条错误消息this._device.Content(out content); “对象引用未设置为对象的实例。”。

添加行:

this.Connect();

第107行之前为我解决了这个问题。

答案 2 :(得分:1)

MediaDevices裸包应该适合您。

来自包装说明:

与智能手机,平板电脑等MTP / WPD设备进行通信的API 和相机。包括文档。

GitHub link)。

要打开设备并在其上写入文件,请执行以下操作:

var devices = MediaDevice.GetDevices();
using (var device = devices.First(d => d.FriendlyName == "My Cell Phone"))
{
  device.Connect();

  device.CreateDirectory(@"\Phone\Documents\Temp");

  using(FileStream stream = File.OpenRead(@"C:/Temp/Test.txt"))
  {
    device.UploadFile(stream, @"\Phone\Documents\Temp\Test.txt");
  }
  device.Disconnect();
}