我在 VB.NET 中调用 Shell.BrowseForFolder,因为我需要在 rootFolder 参数中传递任意路径。所以我实例化了一个这样的对象:
Dim shellType As Type = Type.GetTypeFromProgID("Shell.Application")
Dim shell = Activator.CreateInstance(shellType)
然后我打电话:
Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder)
它没有按预期工作(未使用根文件夹 F:)
但是,如果我使用具有相同参数的反射:
Dim folder = shellType.InvokeMember("BrowseForFolder", _
BindingFlags.InvokeMethod, Nothing, shell, New Object() {0, message, &H241, _
rootFolder})
有用!
但对我来说,两个调用(InvokeMember 和直接调用)应该产生相似的结果(参数相同)。发生了什么?
编辑:
事实上,如果我调用 ToString() 或者如果我放一个小字,它会起作用:
Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder.ToString())
或者
Dim folder = shell.BrowseForFolder(0, message, &H241, "F:")
但如果 rootFolder 是一个参数,它就不起作用,例如:
Function BrowseForFolder(ByVal message As String, ByVal rootFolder As String) As String
Dim shellType As Type = Type.GetTypeFromProgID("Shell.Application")
Dim shell = Activator.CreateInstance(shellType)
Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder)
If folder Is Nothing Then
Return ""
End If
Return folder.Self.Path
End Function