【问题标题】:FSharp.Compiler.CodeDom for VS2008 and VS2010 side-by-sideFSharp.Compiler.CodeDom 用于 VS2008 和 VS2010 并排
【发布时间】:2010-05-27 21:28:06
【问题描述】:

我正在使用 FSharp.Compiler.CodeDom(来自 PowerPack)来动态创建 F# 类。问题是,我的计算机上同时安装了 VS2008 和 VS2010(它们工作正常),并且在此配置中使用 F# 充其量是错误的:

  • 如果我不安装 InstallFSharp.msi,那么在 VS2008 下,构建的类会抱怨找不到 FSharp.Core(即使它们被引用)
  • 如果我安装 InstallFSharp.msi,那么在 VS2008 下构建的类将使用为 VS2010 构建的 F#,并且会抛出二进制不兼容异常,因为它会加载 .net4 变体:

    FSC:错误 FS0219:引用的或默认的基本 CLI 库“mscorlib”是二进制的 与引用的 F# 核心库 'C:\Program Files (x86)\Microsoft 不兼容 F#\v4.0\FSharp.Core.dll'。考虑重新编译库或进行显式引用 到与您正在使用的 CLI 版本匹配的此库的版本。

  • 如果我把之前找到的F#替换成单独安装的dll-s,那么VS2010当然会报二进制不兼容

我是否忽略了某些东西,或者它们不会简单地适用于这样的共享环境?当我部署应用程序时,这可能意味着真正的问题。

谢谢

【问题讨论】:

    标签: f# compilation compatibility codedom side-by-side


    【解决方案1】:

    我自己也有类似的问题 - 我们的源代码树的主干设置为使用 VS 2008 构建,而我们最新的分支升级到 VS 2010。至少可以说,F# 的情况令人厌烦。

    我们找到的答案是使用 --noframework 编译器标志。使用该选项集,您可以(必须)指定要使用的 mscorlib.dll 和 System.dll,因此可以针对任何受支持的 .NET 框架进行构建。

    【讨论】:

    • 在 F# 2.0 中,生成的程序集的 ImageRuntimeVersion 似乎默认为 v4.0.xxx。当添加对 mscorlib.dll 的 v2.0 版本的引用时,这将更改为 v2.0.xxxx。即使我没有设置 --noframework,这也有效,我只需要添加显式引用。
    • 有趣!如果我尝试在没有 --noframework 标志的情况下使用 -r mscorlib.dll,我会收到编译器错误。您使用的是哪个版本的编译器允许这样做?
    • 对不起,我想我弄错了。我将 CodeDom.FSharpCodeProvider 与 CompileAssemblyFromSource(...) 一起使用。似乎他们自动添加了 --noframework 标志(即使我没有明确引用 mscorlib.dll ),所以它 is 在调用编译器时实际设置,即使我没有设置它在 CompilerOptions 中明确显示。我可以在 CodeProvider 创建的临时文件 xxx.cmdargs 中看到确切的命令行。
    • Yip - 我认为这是我们能得到的最好的解释。谢谢本。
    【解决方案2】:

    鉴于您刚才提出了这个问题,我想知道您是否拥有最新的 PowerPack?值得注意的是,您在 5 月 27 日提出了这个问题,但我在下载页面上看到它最后一次更新是在 5 月 30 日。我不知道这是否会影响任何事情,只是指出来。

    我还稍微编辑了问题,以防将问题移到顶部并导致 Tomas 看到并回复 :)

    【讨论】:

    • 嗯...我在使用最新的 PowerPack 时遇到了这个问题,所以我怀疑行为已经改变。 CodeDom 编译器没有记录在案,编译器的开关和默认值与以前的版本相比发生了变化——曾经有一个 --cli-version 开关。
    【解决方案3】:

    我修复了一个与 reghack (Windows 7) 可能相同也可能不同的问题: Windows 注册表编辑器 5.00 版

    [-HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\FSharp\2.0\Runtime]

    我相信查找文件/编译器的解析路径意味着这种 hack 将导致两者并行工作,但只测试了 2.0 案例。 与任何 reg hack 一样,您应该先备份该 reg 密钥。

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多