F# 是否有可通过FSharp.Core 4.3.0.0重新发行的打包运行时?

F# 是否有可通过FSharp.Core 4.3.0.0重新发行的打包运行时?,f#,f#-3.0,F#,F# 3.0,在我们的环境中,我们有一个服务器场,每个服务器运行许多任务。任务二进制包通过内部调度系统进行部署(并运行任务) 引入微软库或运行时的新公共依赖项时,通常将依赖性推送为服务器级升级(例如,微软VisualC++ +可重新分发包)。目前,服务器上安装了一个名为Microsoft Visual F#2.0 Runtime的软件包,GAC中也安装了FSharp.Core版本4.0.0.0。我不知道从哪里来的,但FSharp.Core 4.3.0.0并不常见 是否有Visual F#3.0的可再发行包可以

在我们的环境中,我们有一个服务器场,每个服务器运行许多任务。任务二进制包通过内部调度系统进行部署(并运行任务)

引入微软库或运行时的新公共依赖项时,通常将依赖性推送为服务器级升级(例如,微软VisualC++ +可重新分发包)。目前,服务器上安装了一个名为Microsoft Visual F#2.0 Runtime的软件包,GAC中也安装了FSharp.Core版本4.0.0.0。我不知道从哪里来的,但FSharp.Core 4.3.0.0并不常见


是否有Visual F#3.0的可再发行包可以将FSharp.Core 4.3.0.0部署到GAC中,或者我们应该在每个任务二进制文件中包含FSharp.Core.dll的副本?事实上,如果可能的话,我会避免一个普通DLL的数百个副本。

有一个仅用于FSharp.Core的版本,其中还包括编译器工具。

Joel Mueller答案中链接的下载(也是)是微软的官方安装程序。它包含编译器、交互式、多版本的运行时以及VisualStudio集成二进制文件

仅当安装了VS(开发方案)时,才会部署VS集成位。否则,它将只安装编译器/交互/运行时(服务器场景)

安装程序只提供运行时的最新版本(目前为4.3.1.0),但也部署了各种其他版本,包括4.3.0.0


将程序集添加到GAC非常容易。只需以管理员身份运行C:\Program Files(x86)\Reference Assembly\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll“。

可能的答案

我很高兴自己错了,也很乐意删除这个答案,但我必须得出结论,没有可再发行的软件包可以将FSharp.Core版本4.3.0.0的系统范围副本安装到GAC中

绕过这个问题

以下WIX脚本创建安装程序集和NGen的.MSI包。当然,测试是有限的,所以只有当您确实需要MSI包来展开程序集时才使用它。为了明确分散任何可能的版权问题的暗示,我将代码发布到公共领域

<?xml version="1.0" encoding="UTF-8"?>
<!--
  This installs FSharp.Core.dll 4.3.0.0 (that comes with Visual Studio
  2012) into the GAC and then NGens it for both 32 and 64 bits.

  Component ID 61F15BE3-6844-46F3-8E8E-3C81A8DBBFCB and keypath
  FSharp_Core_Dll_GAC_File were obtained from VS2012 RTM install DVD,
  file \packages\professionalcore\Setup\vs_professionalcore.msi.
  Other IDs here match those in the Microsoft file for easier reference.
-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:netfx ="http://schemas.microsoft.com/wix/NetFxExtension">
  <Product Id="*" Name="Microsoft F# 3.0 Core Redistributable (4.3.0.0)" Language="1033" Version="4.3.0.0"
           Manufacturer="YOUR COMPANY HERE" UpgradeCode="5271a7ee-8baa-4348-aff7-edb114090cee">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <Property Id="ARPNOMODIFY" Value="yes" Secure="yes" />
    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
    <Feature Id="FsCore" Title="Microsoft F# Core Libraries" Level="1">
      <ComponentRef Id="Redist4.0_GAC_FSharp.Core.dll" />
    </Feature>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="GAC" Name="GAC">
        <Component Id="Redist4.0_GAC_FSharp.Core.dll" Guid="61F15BE3-6844-46F3-8E8E-3C81A8DBBFCB">
          <File Id="FSharp_Core_Dll_GAC_File" Name="FSharp.Core.dll" KeyPath="yes" Assembly=".net"
                Source="C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll">
            <netfx:NativeImage Id="FSharp_Core_Dll_GAC_File_32" Platform="32bit" Priority="1" Debug="no" Dependencies="no" />
            <netfx:NativeImage Id="FSharp_Core_Dll_GAC_File_64" Platform="64bit" Priority="1" Debug="no" Dependencies="no" />
          </File>
        </Component>
      </Directory>
    </Directory>
  </Product>
</Wix>

前者不太相关,因为我们不能使用NuGet包来更新服务器。澄清一下,后者是应该安装在服务器上的可再发行包吗?我们不需要在服务器上使用编译器工具。没有没有工具的包吗?当然,您可以使用NuGet包来更新服务器。它们只是zip文件——如果找不到已编写的程序集,请编写脚本将程序集解压缩到GAC。NuGet包是没有工具的包。就个人而言,我们只是将FSharp.Core.dll与其他依赖项一起重新分发。很抱歉,答案不正确。我刚刚按照您的建议安装了可再发行软件包3.1.2,它在GAC中添加了两个版本的FSharp.Core:2.3.0.0和4.3.1.0。我们的应用程序在尝试绑定到4.3.0.0时仍然无法加载。显然,这个软件包没有安装机器重定向策略。关于NuGet:我确实有一个core v 4.3.0.0的副本。显然,据我所知,它是VS2012附带的,所以我不需要从任何地方安装它。但是在服务器上安装至少需要调用Fusion API才能将程序集放入GAC:你不能只是“将一个包提取到GAC中”,除非我遗漏了一些深刻的东西。>我们不能使用NuGet包来更新服务器。好奇:现在如何部署所有Nuget依赖项?你不能对F#使用同样的技巧吗?为什么要使用GAC?这里的一个问题是服务器上没有
gacutil
,因为这是一个SDK工具。我恰好使用了他也建议的方法,这个扩展可以将程序集安装到GAC上。但这并不是部署更改的自动方式。我知道它可以以可执行文件和MSI的形式推出更新。
candle -ext "C:\Program Files (x86)\WiX Toolset v3.9\bin\WixNetFxExtension.dll" fscore.wxs
light.exe -ext "C:\Program Files (x86)\WiX Toolset v3.9\bin\\WixNetFxExtension.dll" -out FSCoreRedist4300.msi -spdb -sval fscore.wixobj