1

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

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

众所周知,这可以通过向非托管应用程序提供以下 *.exe.config 文件来完成

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

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

因此,我想在运行时supportedRuntime设置此配置,使用 VBA 和/或(更有可能)Windows API 调用。

如何在运行时修改非托管应用程序的“CLR 首选项”?


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

4

1 回答 1

1

仅当您具有混合模式程序集(出于向后兼容性的原因,它不会将它们加载到 CLR 2.0 之外的任何内容中)或尝试加载 4.x 的 2.x 程序集时,才真正需要这些东西<supportedRuntime>useLegacyV2RuntimeActivationPolicy

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

于 2019-06-14T09:35:19.710 回答