这是我用来隔离问题的测试代码:
open Microsoft.FSharp.Metadata
[<EntryPoint>]
let main args =
let core = FSharpAssembly.FromFile @"C:\Program Files\FSharp-2.0.0.0\\bin\FSharp.Core.dll"
let core2 = FSharpAssembly.FSharpLibrary
let core3 = System.AppDomain.CurrentDomain.GetAssemblies()
|> Seq.find (fun a -> a.FullName.Contains "Core")
|> FSharpAssembly.FromAssembly
core.Entities |> Seq.iter (printfn "%A")
0
所有三个let
s 都应该给我相同的 FSharpAssembly。相反,所有 3 都抛出 FSharp.Core 不是 F# 程序集的异常(详情如下,为便于阅读重新格式化)。还有两个线索:
- 使用该
core3
方法,我得到了测试 F# 程序集本身的相同错误 - 做完后我在 FSI 没有收到错误
#r "@C:\Program Files...\FSharp.Powerpack.Metadata.dll"
。
有任何想法吗?我在旧的 XP VM 上使用 Visual Studio 2008、F# 2.0 和 F# Powerpack 2.0.0.0(2010 年 5 月 20 日)版本,但我认为它已更新到 SP3。
(今天早上我收到了 Powerpack 1.9.9.9 的错误,所以我升级到 2.0.0.0。我认为如果 1.9.9.9 不能识别 F# 的 2.0.0.0 程序集,那么 Powerpack 2.0.0.0 中的错误修复可能会有所帮助.)
Unhandled Exception: System.TypeInitializationException:
The type initializer for 'Microsoft.FSharp.Metadata.AssemblyLoader' threw an
exception.
---> System.TypeInitializationException: The type initializer for
'<StartupCode$FSharp-PowerPack-Metadata>.$Metadata' threw an exception.
---> System.ArgumentException: could not produce an FSharpAssembly
object for the assembly 'FSharp.Core' because
this is not an F# assembly
Parameter name: name
at Microsoft.FSharp.Metadata.AssemblyLoader.Add(String name,Assembly assembly)
at <StartupCode$FSharp-PowerPack-Metadata>.$Metadata..cctor()
--- End of inner exception stack trace ---
at Microsoft.FSharp.Metadata.AssemblyLoader..cctor()
--- End of inner exception stack trace ---
at Microsoft.FSharp.Metadata.AssemblyLoader.Get(Assembly assembly)
at Microsoft.FSharp.Metadata.FSharpAssembly.FromAssembly(Assembly assembly)
at Program.main(String[] args) in
C:\Documents an...\FSMetadataTest\Program.fs:line 11
Press any key to continue . . .