2011-08-30 51 views
2

我们开发了一个需要从非托管C++程序(以及Fortran程序)访问的C#4.0模块。 DLL被正确加载并且该方法可用于C++程序,但在调用指向C#代码的方法时会引发异常。对于可视化:在C++代码中更改.NET 4运行时激活策略

[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?

回答

2

从我的理解,这是不可能的。

的问题是,配置设置,您需要申请()基本上是说“这整个应用程序,无论什么装配要求,使用CLR 4代替。

如果可以申请它以一个DLL,你会在这里侵犯的目标 - 因为目标是迫使所有组件使用CLR 4


编辑:

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

+0

因此,不可能通过非托管C++调用.NET 4代码? –

+0

@Chuck:如果您需要混合模式(C++/CLI).NET 4程序,据我所知,您必须**更改应用程序本身的app.Config。这令人难以置信的烦人,我真的希望我错了。 (我们经历了这个,我被迫将一个庞大的代码库移植到.NET 3.5中,正是出于这个原因 - 我无法在不打破另一个[第三方]插件的情况下将该策略添加到应用程序中,所以我被迫回到3.5端口) –

+0

哦,jeez。我所做的每一项研究都表明了同样的事情,但我希望有一个神奇的解决方案。非常感谢你的帮助。 –