这可能是一个noob问题,但似乎尽管检查了15多个资源,我仍然缺少使用.NET中的COM接口的一件事。
我想使用Windows Shell解压缩文件。 (我的目标:适用于Windows XP及更高版本,没有第三方Zip库,没有.DLL和我的exe .net4.0一起使用。)只需实例化Shell.Application
COM对象并调用其方法。 (简约方法。)
我可以使用早期绑定来处理它(source,构建正常):
Dim sc As New Shell32.ShellClass()
Dim SrcFlder As Shell32.Folder = sc.NameSpace(sourceFilename)
Dim DestFlder As Shell32.Folder = sc.NameSpace(destinationDirName)
Dim Items As Shell32.FolderItems = SrcFlder.Items()
DestFlder.CopyHere(Items, 16) '16 = Respond with "Yes to All"
我也可以使用vba中的后期绑定来处理它,我有经验。但是,我不确定如何在.net 中使用后期绑定来讨论COM模块中的类型。以下转换代码的前两行有效,但如何创建 Shell32.folder 类型的变量?它不是像Shell.Application
那样的公共类型(在Windows注册表中注册)。
Dim st As Type = Type.GetTypeFromProgID("Shell.Application", True)
Dim sc As Object = Activator.CreateInstance(st, True)
'how to instantiate the following 'Shell32.Folder' and 'Shell32.FolderItems' types?
'Dim SrcFlder As Shell32.Folder = sc.NameSpace("d:\test.zip")
'Dim DestFlder As Shell32.Folder = sc.NameSpace("d:\test")
'Dim Items As Shell32.FolderItems = SrcFlder.Items()
'this will be called probably through the reflection, correct?
'DestFlder.CopyHere(Items, 16) '16 = Respond with "Yes to All"
重述这个例子:我主要不是要求解压缩(虽然我需要它),但我想使用后期绑定(不仅仅使用早期绑定)正确使用.NET中的COM对象
答案 0 :(得分:1)
您需要使用CreateObject
并将每个对象定义为Object
示例(未经测试):
Dim sc As Object = CreateObject("Shell32.ShellClass")
Dim SrcFlder As Object = sc.NameSpace(sourceFilename)
Dim DestFlder As Object = sc.NameSpace(destinationDirName)
Dim Items As Object= SrcFlder.Items()
DestFlder.CopyHere(Items, 16) '16 = Respond with "Yes to All"
请注意,这不会使用Option Strict On
进行编译但是我会说你应该尽可能地尝试早期绑定。