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

Vb.net 在Visual Basic.NET中访问MTP/WPD设备,vb.net,dll,mtp,wpd,Vb.net,Dll,Mtp,Wpd,是否有VB.net可用的库使我能够轻松访问MTP设备?我希望能够找出连接的设备,列出它们的内容,并在它们之间复制文件 我所看到的所有内容(无论是在堆栈溢出,在微软网站上还是在简单的谷歌搜索中)都是C++、C语言或其他不是VB.net的语言。Microsoft文档完全超出了我的理解范围 因此,除非我计划学习一门新的语言,否则这一切都是不可能的 我确实找到了给我希望的东西。然而,没有文档,它似乎没有完全实现,我尝试做某些事情时返回了一个异常,作者告诉我,它是针对一个旧API编写的,我不应该使用,并且

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

我所看到的所有内容(无论是在堆栈溢出,在微软网站上还是在简单的谷歌搜索中)都是C++、C语言或其他不是VB.net的语言。Microsoft文档完全超出了我的理解范围

因此,除非我计划学习一门新的语言,否则这一切都是不可能的

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

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

一个Windows便携式设备类库 注:这是克里斯托弗·吉尔斯(Christophe Geers)在一系列博客上的作品,这些博客可以

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

文档:

研究

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

重要注意事项 警告

我几乎没有便携式设备(也找不到),所以测试相当有限

文件和文件夹

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

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

我也开始实现一个文件夹集合,然后弄明白了为什么会是这样。由于文件夹可以包含子文件夹,因此将文件链接到子文件夹或将文件夹链接到便携设备将更容易混淆和产生问题。所以,我离开了

这意味着必须测试
文件
集合中的每个项目,以确定它是真正的
文件
还是
文件夹
。这通常通过以下两种方式之一完成:

' 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
中添加了
IsFile
IsFolder
函数,它允许:

If item.IsFolder Then
   DisplayFolderContents(dev, CType(item, PortableDeviceFolder))
End If
还有一种方法返回
ItemType
enum值(还有一种可能有用的静态版本):

资源 格尔斯先生的

对于可能有用的WPD

有关更多信息,请稍后准备制作mods

一个VB控制台应用程序(只是一个翻译)展示了如何使用一些函数。研究博客的细节

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

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

  • 我想您应该将
    Interop.
    DLL保存在带有
    PortableDevice.DLL
    的文件夹中。例如,将它们与DLL一起复制到工具目录。我不知道他为什么那样做
  • 要在项目中使用新的类库,显然需要添加对全新的
    PortableDevice.DLL
    的引用
当然,使用项目源文件,您可以加载它并重新编译为所需的任何格式。VS编译C#项目的方式与在VB中相同

在我的机器上工作

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

(这应该是对的注释,但我没有足够的声誉来添加注释)

@理查德说:

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

添加行:

this.Connect();
在第107行为我解决问题之前。

这个nuget软件包应该适合你

从包装说明:

用于与智能手机、平板电脑等MTP/WPD设备通信的API 还有照相机。包括文件

()

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

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();
}

为什么库必须在VB中?您一直在使用编译后的C#程序集的代码—NET框架。博客代码可以很容易地转换成类库。当然你可以找到一个代码转换器。鉴于我对C#不太了解,所以我无法将博客代码转换成类库。@Jeff感谢关于代码转换器的提示。我不知道有这样的事。单靠代码转换器是不起作用的——有些
不安全的
块使用的指针没有简单的VB翻译。哇,这太棒了。非常感谢你!我已经试过了,但在查看Galaxy S3时,它抛出了一个未处理的异常。有没有办法让我真的厚着脸皮,问你是否介意从我的个人资料中抓取我的电子邮件,这样我就可以给你发送这条消息?我保证不会浪费你太多的时间。我很害怕——我只有两台设备要测试
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();
}