如何在 运行 时间设置首选 FOR (<supportedRuntime>) 的非托管应用程序?

How do I set an unmanaged application's prefered CLR (<supportedRuntime>) at run time?

我有一个非托管应用程序 (MSACCESS.EXE),它动态加载各种 .NET 程序集(通过 COM 互操作)。

目前,非托管应用程序会在加载第一个程序集时自动初始化 .NET 2.0 CLR。由于我想将(部分).NET 程序集迁移到 .NET Framework 4.x,我希望非托管应用程序改为加载 .NET 4.0 CLR。​​

众所周知:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0.30319"/>
  </startup>
</configuration>

这行得通。但是,它需要创建修改用户的 MS Office 安装(通过在与 msaccess.exe 相同的文件夹中创建一个文件),我想避免这种情况,因为 (a) 它需要管理权限,并且 (b) 它可能也会影响其他不相关的基于 Access 的应用程序。

因此,我想在 运行-time 设置此 supportedRuntime 配置,使用 VBA and/or (更有可能)Windows API 调用。

如何在 运行 时修改非托管应用程序的 "CLR preference"?


我尝试并排除的替代解决方案:

<supportedRuntime>useLegacyV2RuntimeActivationPolicy 东西只有在你有 mixed-mode 程序集时才真正需要(其中,出于向后兼容性的原因,它不会将它们加载到 CLR 之外的任何东西中2.0) 或 2.x 试图加载 4.x 的程序集。

如果您有纯托管程序集,那么 .NET 4 的 in-process side-by-side execution 将确保 CLR 2.x 和 CLR 4.x 可以根据程序集的需要在同一进程中加载.您可能 运行 遇到的唯一真正问题是在 2.x 运行 时间内加载的程序集将无法加载 4.x 程序集;在那种情况下,您仍然必须通过配置强制使用 4.x 框架。同样,通过远程处理和 AppDomains 共享数据不适用于不同框架中的组件 运行,尽管这种情况相当罕见。