"InvalidCastException was unhandled"
本文关键字:quot unhandled InvalidCastException was | 更新日期: 2023-09-27 18:30:58
我正在尝试做一个应用程序,告诉我所有视频的总时间。它不切实际,这只是提高我的编码能力的一种练习:)
在这一行中是错误
Shell32.Shell shell = new Shell32.Shell();
这是错误
无法将类型为"系统 .__ ComObject"的 COM 对象强制转换为接口 键入"壳牌32.壳牌"。操作中出现错误,因为 查询与 IID 接口的 COM 组件上的接口调用 '{} 286E6F1B-7113-4355-9562-96B7E9D64C54' 生成了以下内容 错误:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Shell32;
namespace cuentavideosconsola
{
class Program
{
static void Main(string[] args)
{
double contartiempo = 0;
Shell32.Shell shell = new Shell32.Shell();
Shell32.Folder carpeta;
carpeta = shell.NameSpace(@"D:'");
foreach(Shell32.FolderItem2 item in carpeta.Items()){
Console.WriteLine(carpeta.GetDetailsOf(item,27));
TimeSpan tiempo = TimeSpan.Parse(carpeta.GetDetailsOf(item,27));
contartiempo += tiempo.TotalSeconds;
}
Console.WriteLine("El total de tiempo de los videos es: " + contartiempo);
Console.ReadLine();
}
}
}
显然,
这是 Windows 8 中的一个功能,会导致您的原始代码无法正常工作。我在这里找到了答案:
如何在 C# 应用程序中使用 Shell32?
我在下面更新了您的代码。经过测试并在 Win 8 专业版上运行。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Shell32;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double contartiempo = 0;
//Shell32.Shell shell = new Shell32.Shell();
Shell32.Folder carpeta;
carpeta = GetShell32Folder(@"D:'");
foreach (Shell32.FolderItem2 item in carpeta.Items()) {
Console.WriteLine(carpeta.GetDetailsOf(item, 27));
TimeSpan tiempo = TimeSpan.Parse(carpeta.GetDetailsOf(item, 27));
contartiempo += tiempo.TotalSeconds;
}
Console.WriteLine("El total de tiempo de los videos es: " + contartiempo);
Console.ReadLine();
}
private static Shell32.Folder GetShell32Folder(string folderPath)
{
Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
Object shell = Activator.CreateInstance(shellAppType);
return (Shell32.Folder)shellAppType.InvokeMember("NameSpace",
System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folderPath });
}
}
}
确保从 Windows/system32 Add Reference
Shell32.dll
。
即使正在构建 x86,引用也必须指向 windows/system32 文件夹。