在Visual Basic .NET中访问MTP设备

问题描述 投票:2回答:3

VB.net是否有可用的库使我能够轻松访问MTP设备?我希望能够找出已连接的设备,列出它们的内容并向它们复制文件。

到目前为止,我所看到的所有内容(无论是在Stack Overflow上,在Microsoft网站上,还是通过简单的Google搜索)都使用C ++,C#或其他不是VB.net的语言。 Microsoft文档完全让我烦恼。

因此,除非我计划学习一种新语言,否则所有这些都不是入门者。

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

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

vb.net dll mtp
3个回答
5
投票

窗口便携式设备类库

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

我主要添加了一些功能,VB控制台测试,并将其转换为Class Lib。我对代码中的一些内容进行了调整,以简化代码,但是这些内容不值得进一步提及。

文档:

Study Mr Geers' blog

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

重要注意事项

注意

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

文件和文件夹

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

如本文所述,PortableDeviceObjectPortableDeviceFile都是从PortableDeviceFolder类型(类)继承的。 PortableDeviceObject有一个名为Files的属性集合,但该集合实际上包含PortableDeviceObject。该集合中的任何一项实际上都可能是另一个文件夹。

我也开始实现Folders集合,然后找出原因。由于文件夹可以包含子文件夹,因此将文件链接到子文件夹再将文件夹链接到PortableDevice会更加混乱和麻烦。所以,我离开了。

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

' 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先生的博客,而我不愿意发布不是我的代码。此外,如果无法将C#代码编译为DLL,那么显然对您没有什么帮助。因此,要回答提出的问题,

VB.net是否有可用的库使我能够轻松访问MTP设备?

修改后的源代码,项目文件(VS2012),新的VB控制台测试应用程序和二进制文件(PortableDevices.dll)可以为downloaded from DropBox。 bin / compile文件夹包括适用于AnyCPU / Release和x86 / Release的内部版本
  • 思考,您将要使用Interop.*保留位于这些文件夹中的PortableDevice.DLL DLL。例如,将它们与DLL一起复制到您的工具目录中。我不确定他为什么这样做。
要在项目中使用新的类库,您显然需要添加对全新PortableDevice.DLL的引用。
  • 当然,使用项目源文件,您可以加载它并重新编译为所需的任何格式。 VS以与在VB中相同的方式编译C#项目。

    << img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9sS0FDNS5qcGcifQ==” alt =“在此处输入图像描述”>

    在我的机器上工作TM

  • 再次,要明确,这不是我的工作。我主要将其编译为DLL。

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

    1
    投票
    MediaDevices nuget包应该适合您。
    © www.soinside.com 2019 - 2024. All rights reserved.