【问题标题】:Accessing an MTP/WPD device in Visual Basic .NET在 Visual Basic .NET 中访问 MTP/WPD 设备
【发布时间】:2014-12-18 08:10:40
【问题描述】:

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

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

因此,除非我打算学习一门新语言,否则这一切都是徒劳的。

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

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

【问题讨论】:

  • 为什么 Lib 必须在 VB 中?您一直使用来自已编译 C# 程序集的代码 - NET Framework。博客代码可以轻松转换为类库。
  • 你肯定能找到一个代码转换器
  • 将博客代码转换为类库超出了我的能力范围,因为我对 C# 的理解不够好,无法知道发生了什么。
  • @Jeff 感谢有关代码转换器的提示。没想到有这样的事。会试一试。
  • 单独的代码转换器无法工作 - 有一些 unsafe 块使用指针,这些指针没有简单的 VB 转换。

标签: vb.net dll mtp wpd


【解决方案1】:

一个窗口便携设备类库

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

我主要是加了几个函数,一个VB控制台测试,转成Class Lib。我在代码中调整了一些东西以简化它,但它们不值得一提。

文档:

学习 Mr Geers' blog

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

重要提示

警告

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

文件和文件夹

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

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

我也开始实现 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

为了让事情稍微更简单,更面向对象,我在PortableDeviceObject 中添加了IsFileIsFolder 函数,它允许:

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

Another C# Project 用于 WPD,可能有用

MSDN Windows Portable Devices documentation 在您准备稍后制作模组时获取更多信息。

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

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

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

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

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

在我的机器上工作TM

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

【讨论】:

  • 哇,太棒了。非常感谢!我已经尝试过了,但是在查看我的 Galaxy S3 时它会引发未处理的异常。有什么办法可以让我非常厚颜无耻地问你是否介意从我的个人资料中获取我的电子邮件,以便我可以向你发送这条消息?我保证不会浪费你太多时间。
  • 我很害怕——我只有 2 台设备可以测试它,而且自从他的代码发布以来,已经有很多其他设备出现了。如果您打开项目,VB 测试应用程序将运行 LIB prj 中的 C# 代码。当它出错时,您可以告诉我线路和实际异常,我会看看是否可以修复。需要更多信息,比如它发生的时间、地点、内容等。
  • 我很感激你到目前为止所做的一切。所以我插入了 Galaxy S3,它有两个存储区域(“内部存储”和“SD 卡”)。当我运行 C# 代码时,在第 107 行出现错误this._device.Content(out content);“对象引用未设置为对象的实例。”。 content 为 NULL,但有一个 DeviceID 集。
  • 怀疑交易是“内部存储”和“SD 卡”的东西是您设备中的设备(嵌套)。因此,与 IsFile、IsFolder 一样,它可能需要一个 IsDevice。您可以将 VB 代码更改为不根据名称轮询该设备,看看它是否也在它们两个上都崩溃了。
  • 只连接了一台设备,FriendlyName 似乎是""。它在尝试获取内容时失败。我的(未受过教育的)猜测是,每个都是设备中的设备。 edit 刚刚发现你的评论 :)
【解决方案2】:

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

@Richard 说:

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

添加行:

this.Connect();

在第 107 行为我解决问题之前。

【讨论】:

    【解决方案3】:

    这个MediaDevices nuget 包应该适合你。

    来自包装说明:

    用于与智能手机、平板电脑等 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多