Я вызываю Shell.BrowseForFolder в VB.NET, потому что мне нужно передать произвольный путь в аргументе rootFolder. Поэтому я создании экземпляра в Objet так:InvokeMember дает отличный результат, чем прямой вызов
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})
Это работает!
Но для меня 2 звонки (InvokeMember и прямой вызов) должны давать одинаковые результаты (аргументы идентичны). Что происходит?
Edit:
На самом деле, это работает, если я называю ToString(), или если я положил litteral:
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
Согласен, не может быть воспроизведен здесь или на vs2010., Той же ОС. – RobS
Я работаю с VS 2010 на 64-разрядной ОС Windows 7. rootFolder - это строка, инициализированная «F:». Этот диск существует на моем компьютере. – Maxence
@Maxence, я думаю, я нашел, как исправить это, я смог воспроизвести проблему – Fredou