在 Visual Basic .NET 中访问 MTP/WPD 设备

Ric*_*ard 2 vb.net dll wpd mtp

是否有任何可用于 VB.net 的库使我能够轻松访问 MTP 设备?我希望能够找出连接了哪些设备,列出它们的内容并将文件复制到它们或从它们复制文件。

到目前为止,我看到的所有内容(在 Stack Overflow、Microsoft 网站上或通过简单的 Google 搜索)都是使用 C++、C# 或其他非 VB.net 语言编写的。Microsoft 文档完全超出了我的理解。

结果,除非我打算学习一门新语言,否则一切都不是入门。

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

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

Ňɏs*_*arp 6

一个 Window 便携式设备类库

注意:这是Christophe Geers的一系列博客的作品,可在此处找到

我主要是加了几个函数,一个VB控制台测试,转换成Class Lib。我调整了代码中的一些内容以简化它,但它们不值得进一步提及。

文档:

研究 Geers 先生的博客

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

重要笔记

警告

我的便携式设备很少(并且找不到),因此测试相当有限。

文件和文件夹

术语FileFolder在这种情况下可能会产生误导。

正如文章所说,有一个PortableDeviceObject类型(类),PortableDeviceFilePortableDeviceFolder都从它继承。 PortableDeviceObject有一个名为 的属性集合Files,但该集合实际上包含PortableDeviceObjects。该集合中的任何一个项目实际上都可能是另一个文件夹。

我也开始实施文件夹集合,然后弄清楚为什么会这样。由于文件夹可以包含子文件夹,因此将文件链接到子文件夹到文件夹到便携式设备会更加混乱和成问题。所以,我离开了它。

这意味着Files必须测试集合中的每个项目,以查看它是否真的是 aFile或 aFolder。这通常可以通过以下两种方式之一完成:

' 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
Run Code Online (Sandbox Code Playgroud)

为了使事情稍微简单一些并且更加面向对象,我添加了一个IsFileandIsFolder函数,PortableDeviceObject它允许:

If item.IsFolder Then
   DisplayFolderContents(dev, CType(item, PortableDeviceFolder))
End If
Run Code Online (Sandbox Code Playgroud)

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

' using GetItemType
If item.GetItemType = PortableDeviceObject.ItemTypes.File Then
    Console.Beep()
End If
Run Code Online (Sandbox Code Playgroud)

资源

吉尔斯先生的原始出处

另一个可能有用的 WPD C# 项目

MSDN Windows 便携式设备文档以获取更多信息,以便您稍后准备制作模组。

一个 VB 控制台应用程序(只是一个翻译)展示了如何使用某些功能。研究博客 fr 详细信息。

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

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

  • 认为您会希望将Interop.*DLL保存在那些带有PortableDevice.DLL. 例如,将它们与 DLL 一起复制到您的工具目录。我不知道他为什么那样做。
  • 要在项目中使用新的类库,您显然需要添加对全新PortableDevice.DLL.

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

在此处输入图片说明

适用于我的机器TM

再次声明,这不是我的工作。我主要是编译成DLL。