刚开始搜索这个问题的时候大多都说是Interop.Shell32.dll这个库的版本问题,要换到1.2.才能正常使用,结果找一圈全是积分下载,一个库都稀罕:|
然后自己回过头尝试了一下,同样的方法在新建的vs2022版本demo以及vs2013demo都可以正常获取文件时长信息,那就不应该是版本的问题
public static long GetMediaTime(string path)//Path为语音文件路径
{
// string path = HttpContent.Current.Server.MapPath(voicePath);//将虚拟路径 转换为绝对路径,这里必须用绝对路径!
string dirName = Path.GetDirectoryName(path);//获取文件夹名称
string voiceName = Path.GetFileName(path);//获取文件名
FileInfo file = new FileInfo(path);
ShellClass sh = new ShellClass();
Folder dir = sh.NameSpace(dirName);
FolderItem item = dir.ParseName(voiceName);
string songTime = dir.GetDetailsOf(item, 27);//win7参数为27
string[] str = songTime.Split(':');
if (str.Length > 2)
{
return (long)(Convert.ToInt32(str[0]) * 60 * 60 + Convert.ToInt32(str[1]) * 60 + Convert.ToInt32(str[2])) * 1000;
}
else
{
return (long)(Convert.ToInt32(str[1]) * 60 + Convert.ToInt32(str[2])) * 1000;
}
// return songTime;
//原文:https://www.cnblogs.com/sunshineground/p/3637940.html
}
在我纳闷为什么在自己项目跑不起来的时候,我突然注意到自己使用的时候是放到线程里面运行的,然后试了一下给其他demo套个线程,还真是报同样的错。
这下关键词变成了为什么com组件会在线程中报错
参考:解决C#调用COM组件异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)的错误 - 走看看
问题解决:)作个记录,留给可能需要的人