MCR和.NET不兼容性问题

8
我正在尝试编译一个使用.NET模块的Matlab应用程序(R2010b),但我遇到了MCR和.NET模块不兼容的问题:
  • .NET模块是使用Visual Studio 2010编译的。
  • MCR配置为使用Visual Studio 2010。
  • 该应用程序还包含一些使用Visual Studio 2010构建的Mex文件,它们在Matlab和MCR中都可以正常工作。
如果我从Matlab cli加载程序集,一切都很正常,但是一旦我编译应用程序并从cmd.exe运行它,就会抛出错误,指出程序集是使用比当前已加载程序更高版本的运行时构建的。我认为Matlab R2010b是使用Visual Studio 2008构建的,我认为这是问题所在,但我想知道是否有人对此问题有解决方案?

2
MATLAB接口支持.NET Framework 2.0的功能,并与版本2.0及其兼容版本(版本3.0和3.5)一起使用。如果您的系统安装了版本4.0,则MATLAB支持加载Framework版本4.0程序集。但是,版本4.0特定的功能尚未经过测试。 - Mikhail Poda
这不是关于VS版本,而是关于程序集编译的目标框架。使用VS2008和VS2010,您可以编译所有.NET版本,包括旧版本。如果您没有使用特定的.NET 4功能,则可以尝试编译为.NET 3.5。 - Mikhail Poda
但是,如果我从cli中加载它,汇编工作得很好,所以我认为问题不在于.NET 4.0中不兼容的功能。 - trondd
1个回答

7
解决方案是在编译后的exe文件旁边提供一个应用程序配置文件(对于名为foo.exe的应用程序,该文件名为foo.exe.config),并包含以下条目:
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
 </configuration>

MATLAB .NET接口是使用.NET框架2.0构建的,这意味着在没有应用程序配置文件的情况下,将加载2.0 CLR。在MATLAB中运行时,配置文件中的<supportedRuntime>条目告诉MATLAB如果可用,则加载4.0 CLR。


1
很好了解!您能否提供此文档的原始来源链接?我猜它是.NET框架的一部分? - trondd
1
@trondd 这里是有关supportedRuntime的msdn链接link。useLegacyV2RuntimeActivationPolicy已经在link中讨论过,当在.NET 4.0中使用混合模式程序集(C++/CLI)时非常重要。我还忘记提到MATLAB已经在$MATLABROOT\bin$ARCH中提供了一个配置文件MATLAB.exe.config,这就是为什么在MATLAB中可以正常工作的原因。 - Shaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接