我有一个非托管应用程序(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首选项”?
我尝试并排除的替代解决方案:
CorBindToRuntimeEx
以下方式动态加载正确的CLR:这可以解决我的问题,但是我无法使其与后期绑定一起使用。这就是为什么我目前正在研究替代方法。仅当您具有混合模式程序集(出于向后兼容性原因,它将不以CLR 2.0以外的任何方式加载它们)或尝试加载4.x的2.x程序集时,<supportedRuntime>
anduseLegacyV2RuntimeActivationPolicy
才真正需要。
如果您具有纯托管程序集,则.NET 4的进程内并行执行将确保根据程序集的需要,可以在同一进程中加载CLR 2.x和CLR4.x。您可能遇到的唯一真正的问题是,在2.x运行时中加载的程序集将无法加载4.x程序集。在那种情况下,您仍然必须通过配置强制4.x框架。同样,通过远程处理和AppDomains共享数据不适用于在不同框架中运行的组件,尽管这种情况很少见。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句