Я нашел непосредственную причину проблемы, прочитав источник Powerpack на Codeplex . Powerpack.Metadata всегда загружает FSharp.Core перед любой другой сборкой, поэтому, если она сломана, она блокирует остальные.
Из моего исследования большинство других сборок F # переносят свои метаданные с собой в поток ресурсов манифеста с именем "FSharpSignatureData. Package.Name " - вот где библиотека метаданных выглядит первой. Но FSharp.Core не делает. (По крайней мере, на моей виртуальной машине XP загрузка 2.0.0.0 для VS 2008 этого не делает.) Таким образом, метаданные Powerpack ищут файл с именем FSharp.Core.sigdata в том же каталоге, где он ожидает найти файл FSharp.Core.dll.
Код ищет четыре места для этого имени каталога:
- ConfigurationSettings.AppSettings. [ "FSharp-ядро-referenceassembly-место"].
- Раздел реестра
@"SOFTWARE\Microsoft\.NETFramework\" + MSCorLibRunningRuntimeVersion + @"\AssemblyFoldersEx\Microsoft Visual F# 4.0"
, где MSCorLibRunningRuntimeVersion определяется отражением - в моем случае это "v2.0.50727". Я думаю, что это применимо, только если у вас VS 2010 и, следовательно, F # 4.0
- Раздел реестра
@"Software\Microsoft\.NETFramework\AssemblyFolders\Microsoft.FSharp-" + FSharpTeamVersionNumber
, где FSharpTeamVersionNumber жестко задан как "1.9.9.9", по крайней мере, в версии codeplex. На моем компьютере не установлен исходный код выпуска за май 2010 года.
- System.AppDomain.CurrentDomain.BaseDirectory. Это каталог bin / Debug вашего локального проекта, , если вы не находитесь в fsi. Тогда это какой-то вариант C: \ Program Files \ FSharp-2.0.0.0 \ bin.
Для меня все четверо терпят неудачу:
- У меня нет файла конфигурации приложения. Я не очень хорошо знаю экосистему .NET, поэтому не знаю, как ее создать.
- У меня не установлена VS 2010.
- У меня есть ключ Microsoft.FSharp-2.0.0.0 в нужном месте, но нет ключа Microsoft.FSharp-1.9.9.9.
- Мой локальный проект не имеет копии FSharp.Core.sigdata в каталоге bin / Debug.
Теперь, когда я знаю, что происходит, у меня есть ряд исправлений (помимо использования реальной машины с Windows вместо старой виртуальной машины, которую я планирую исправить примерно через месяц). Я должен вероятно узнать о файлах конфигурации .NET в любом случае, так что это, вероятно, лучшее среднесрочное решение. Создание раздела реестра «Microsoft.FSharp-1.9.9.9» или копирование FSharp.Core.sigdata в каталог bin / Debug - это очень простое краткосрочное исправление.
Я до сих пор не знаю, должна ли эта ошибка быть широко распространенной или она вызвана моими обновлениями с VS 2005-> 2008 и несколькими F # превью. После прочтения исходного кода codeplex мне кажется, что другие люди без VS 2010 также должны иметь эту проблему только потому, что FSharpTeamVersionNumber жестко задан как 1.9.9.9 и не был обновлен в соответствии с ключом реестра, 2.0.0.0. Но, возможно, порядок, который я обновил до F # 2.0 и F # Powerpack 2.0, был ошибочно смешан, чтобы вызвать это состояние. Или, может быть, недостаточно людей, использующих библиотеку метаданных, чтобы выявить ошибку.