.Net Framework 4.7.2
这是一个非常令人惊讶的问题...
我有一个 routine ,可以从本地磁盘获取所有可用的Inventor模板,无论它是哪个版本:
private static IEnumerable<string> GetInventorTemplates_FAILS()
{
var publicPath = Environment.GetEnvironmentVariable("PUBLIC");
var autodeskPath = Path.Combine(publicPath, "Documents", "Autodesk");
var inventorPaths = Directory.GetDirectories(autodeskPath, "*Inventor*");
var templatePaths = inventorPaths.Select(path => Path.Combine(path, "Templates"));
var templates = templatePaths.Where(Directory.Exists).SelectMany(path => Directory.GetFiles(path, "*.*", SearchOption.AllDirectories));
// throws error ^^^^^^^^^^^^^^^^
return templates;
}
如果我运行此代码,我会出现以下错误:
System.Linq.SystemCore_EnumerableDebugView`1[System.String].get_Items() calls into native method Microsoft.Win32.Win32Native.GetFullPathName(char*, int, char*, System.IntPtr). Evaluation of native methods in this context is not supported.
更疯狂的是,如果我重写代码,手动调用Directory.Exists
,它就会工作!!!
private static IEnumerable<string> GetInventorTemplates_WORKS()
{
var publicPath = Environment.GetEnvironmentVariable("PUBLIC");
var autodeskPath = Path.Combine(publicPath, "Documents", "Autodesk");
var inventorPaths = Directory.GetDirectories(autodeskPath, "*Inventor*");
var templatePaths = inventorPaths.Select(path => Path.Combine(path, "Templates"));
foreach (var path in templatePaths)
if (Directory.Exists(path)) // <- no exception!!!
foreach (var template in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories))
yield return template;
}
如果您只需通过QuickWatch进行判断,就会得到相同的结果:
现在我可以使用重写的版本,但我很好奇我是不是幸运的…:-)