我正在尝试编写一个 c# 自定义操作并使用 .Net 2,但是我似乎无法让事情正常工作。我相信 MSI 使用了错误的 CLR 版本。我在日志文件上面几行中看到了这一点,其中 MSI 正在调用我的 CA(如果我注释掉我的 CA,行不会出现):

SFXCA: Binding to CLR version v4.0.30319.

我的自定义操作似乎没有加载(假设因为我没有看到任何日志消息)。我正在使用 Wiz 3.6.3014.0。这是支持的还是 Windows Installer 只使用机器上可用的最新运行时?

谢谢

最佳答案

当您使用 WiX 创建 C# 自定义操作项目时,默认情况下它会创建一个名为 CustomAction.config 的 XML 文件。此文件的目的是指示 sfxca.dll 在运行代码时使用哪个版本的 CLR。此文件的默认实现如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">

        <!--
          Use supportedRuntime tags to explicitly specify the version(s) of the .NET Framework runtime that
          the custom action should run on. If no versions are specified, the chosen version of the runtime
          will be the "best" match to what Microsoft.Deployment.WindowsInstaller.dll was built against.

          WARNING: leaving the version unspecified is dangerous as it introduces a risk of compatibility
          problems with future versions of the .NET Framework runtime. It is highly recommended that you specify
          only the version(s) of the .NET Framework runtime that you have tested against.

          Note for .NET Framework v3.0 and v3.5, the runtime version is still v2.0.

          In order to enable .NET Framework version 2.0 runtime activation policy, which is to load all assemblies
          by using the latest supported runtime, @useLegacyV2RuntimeActivationPolicy="true".

          For more information, see http://msdn.microsoft.com/en-us/library/bbx34a2h.aspx
        -->

        <supportedRuntime version="v4.0" />
        <supportedRuntime version="v2.0.50727"/>

    </startup>

    <!--
      Add additional configuration settings here. For more information on application config files,
      see http://msdn.microsoft.com/en-us/library/kza1yk3a.aspx
    -->

</configuration>

基本上,允许使用 .NET 2.0/3.0/3.5(所有 CLR 2.0)编写的 CA 在 4.0 上运行是一个很好的做法,因为您可能会遇到一台只安装了 4.0 的机器。通常,您的代码应该适用于 4.0,如果不是,我会修复它。

或者,您可以将配置文件更新为仅允许在 2.0 上运行,然后将所需的检查放入安装程序以确保该版本的 CLR 已实际安装。

关于WIX CustomAction 加载 CLR 4.0 而不是 2.0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11091493/

10-13 07:57