我在VB.NET中調用Shell.BrowseForFolder,因爲我需要在rootFolder參數中傳遞任意路徑。所以,我實例化一個像這樣的客體: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和直接調用)應該產生類似的結果(參數是相同的)。發生了什麼?
編輯:
事實上,它的工作原理,如果我調用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
我在Windows 7 64位操作系統上使用VS 2010。 rootFolder是一個用「F:」初始化的字符串。該磁盤存在於我的電腦上。 – Maxence
@Maxence,我想我找到了解決方法,我能夠重現問題 – Fredou