C# 在不将当前项目目标框架从v4.0升级到v4.6 C的情况下使用4.6v dll#

C# 在不将当前项目目标框架从v4.0升级到v4.6 C的情况下使用4.6v dll#,c#,.net,dll,clr,.net-framework-version,C#,.net,Dll,Clr,.net Framework Version,我有一个要求,我不应该升级我的WPF应用程序的4.0版本到4.6,因为我们正在使用一些传统的第三方控件,这会导致大量的错误,但我应该在我的WPF项目中使用版本4.6的dll。请建议我一些解决方法来实现这一点 我是COM编程新手。我认为上述是可能的,例如,我们使用outlook 2016 DLL等,在我们的4.0项目中使用4.5v,将它们作为COM组件添加到我们的项目中。它所需要的只是运行时版本的操作系统应该是4.5 不能在已使用4.0运行时初始化的进程中使用.Net 4.6程序集。原因是4.6的

我有一个要求,我不应该升级我的WPF应用程序的4.0版本到4.6,因为我们正在使用一些传统的第三方控件,这会导致大量的错误,但我应该在我的WPF项目中使用版本4.6的dll。请建议我一些解决方法来实现这一点


我是COM编程新手。我认为上述是可能的,例如,我们使用outlook 2016 DLL等,在我们的4.0项目中使用4.5v,将它们作为COM组件添加到我们的项目中。它所需要的只是运行时版本的操作系统应该是4.5

不能在已使用4.0运行时初始化的进程中使用.Net 4.6程序集。原因是4.6的运行时与4.0的运行时相同,因此它不能像2.0程序集那样并行运行。在进程中加载的VM不会正确解释加载类型的方法表,即使它们被导出为COM接口。原因是,即使要通过Runtime/COM/Runtime间接层,也会在该进程中加载相同的4.0 CLR和系统程序集,并且4.6程序集中运行时类型的实例化似乎会导致CLR方法错误地解释方法表


唯一可以做到这一点的方法是在另一个进程中托管4.6程序集并对其进行远程访问。无论如何,Outlook加载项都可能会发生这种情况,它们是由Outlook进程之外的
dllhost.exe
或类似shell进程托管的。

您可以在此处找到我上面评论的屏幕截图。只要机器中有4.6运行时。我们可以使用反射:


因此,如果您说4.0和4.6目标框架程序集使用相同的4.0 clr,那么我们可以使用反射来实现这一点,因为它们都具有公共运行时。