在C ++代码中为Dll更改.NET 4运行时激活策略

时间:2011-08-30 16:20:18

标签: c# c++ dll c#-4.0 fortran

我们开发了一个C#4.0模块,需要从非托管C ++程序(以及Fortran程序)访问。 DLL正确加载并且该方法可用于C ++程序,但在调用指向C#代码的方法时会抛出异常。对于可视化:

[Unmanaged C++ / Fortran Projects]  
  -> controller.dll (unmanaged C++ within the C++ project)    
     -> managed_wrapper.dll (managed C++ within the C# project)
        -> C# 4.0 Project

当控制器尝试调用托管C ++时(使用.NET 4.0框架),会抛出异常。

我怀疑需要应用以下配置,因为我们之前在creating a proof of concept时遇到错误:

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

我正确地应用了上述概念证明,但这是在一个独立的控制台应用程序上。由于非托管C ++程序非常庞大且每个模块的设置都不通用,因此我无法使用上述配置创建MyApplication.exe.config文件并将其称为日期。

我的问题是:是否可以将该配置应用于特定的DLL?

1 个答案:

答案 0 :(得分:2)

根据我的理解,这是不可能的。

问题在于,您需要应用的配置设置(useLegacyV2RuntimeActivationPolicy)基本上是“对于整个应用程序,无论程序集请求是什么,请改用CLR 4.

如果您可以将其应用于单个DLL,那么您将违反这里的目标 - 因为目标是强制所有程序集使用CLR 4。


编辑:

经过进一步研究,实际上有一种方法可以在一些有限的情况下实现。我posted about this on my blog,但基本上,您可以使用CLR Hosting API获取从库中设置此内容的权限。