在.NET 4.0项目中引用.NET 2.0混合模式程序集时需要什么“附加configuration”?

我有一个项目,我想要使用.NET 4.0的一些function,但是一个核心要求是我可以使用针对2.X编译的System.Data.SQLite框架。 我看到提到这是可能的,例如在这里接受的答案,但我不明白如何实际实现这一点。

当我只是尝试运行我的4.0项目,而引用2.X程序集时,我得到:

混合模式程序集是针对运行时版本“v2.0.50727”构build的,不能在没有附加configuration信息的情况下在4.0运行时加载。

什么“附加configuration”是必要的?

为了使用CLR 2.0 混合模式程序集 ,您需要修改您的App.Config文件以包含:

 <?xml version="1.0"?> 
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true" >
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

关键是useLegacyV2RuntimeActivationPolicy标志。 这会导致CLR使用最新版本(4.0)加载混合模式程序集。 没有这个,它不会工作。

请注意,这只对混合模式(C ++ / CLI)程序集很重要。 您可以加载所有托pipe的CLR 2程序集,而无需在app.config指定。

.NET Framework开发人员中心的此论坛post 。 这可能会提供一些见解。

(添加到应用程序的configuration文件。)

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

根据您定位的框架的版本,您可能需要查看以获取正确的string:

http://msdn.microsoft.com/en-us/library/ee517334.aspx

我浪费了几个小时,试图弄清楚为什么我的发布目标.Net 4.0客户端需要完整版本。 我最终使用了这个:

 <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0,Profile=Client" /> </startup> 

一旦设置了app.config文件,Visual Studio将在名为App.exe.config的bin文件夹中生成一个副本。 在部署期间将其复制到应用程序目录。 听起来很明显,但令人惊讶的是,很多人错过了这一步。 WinForms开发人员不习惯configuration文件:)。

一起使用2.0和4.0程序集不是非常简单的。

app.config中支持的框架声明的ORDER实际上对引发混合模式的exception有影响。 如果您翻转声明顺序,则会出现混合模式错误。 这是这个答案的目的。

因此,如果您在Windows窗体应用程序中遇到错误,请尝试此操作,主要是Windows窗体应用程序。

  <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/> <supportedRuntime version="v2.0.50727"></supportedRuntime> </startup> 

或者如果该项目不是Windows窗体。 在一个Web项目中添加这个到web.config文件。

  <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> <supportedRuntime version="v2.0.50727"></supportedRuntime> </startup> 

能够通过添加“启动”元素与“useLegacyV2RuntimeActivationPolicy”属性设置来解决问题。

 <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> <supportedRuntime version="v2.0.50727"/> </startup> 

但是必须将它作为configuration标签的第一个子元素放在App.config中才能生效

 <?xml version="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> <supportedRuntime version="v2.0.50727"/> </startup> ...... .... 

上述没有为我工作(我正在一个networking应用程序) – 但是这样做…

编辑文件夹中的sgen.exe.config文件(我必须先创build一个文件); C:\ Program Files文件(x86)\ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0工具(也有一个在v7.0文件夹中,但我不需要改变那个,我正在使用VS2012)

XML的内容应该看起来像这样(与以前的答案相同)

 <?xml version ="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/> </startup> </configuration> 

如果您正在使用Web服务,并且v2.0程序集是由WcfSvcHost.exe加载的依赖项,那么您必须包含

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

在.. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config文件中

这样,Visual Studio将能够在运行时通过加载程序发送正确的信息。

当我们更改为Visual Studio 2015时遇到了这个问题。 上面的答案都没有为我们工作。 最后,我们通过将以下configuration文件添加到机器上的所有sgen.exe可执行文件中来实现它

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

特别是在这个位置,即使我们的目标是.NET 4.0:

C:\ Program Files(x86)\ Microsoft SDK \ Windows \ v10.0A \ bin \ NETFX 4.6工具

我用这个configuration:

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

为我工作

升级到Visual Studio 2015时,我遇到了这个问题,这里没有任何一个解决办法有什么区别,虽然configuration是正确的,但是更改的位置却不是。 我通过添加这个configuration来解决这个问题:

 <startup useLegacyV2RuntimeActivationPolicy="true"> </startup> 

到:C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ TE.ProcessHost.Managed.exe.config

然后重新启动Visual Studio。

经过3-4个小时的search,我find了一个解决办法。 我已经添加了以下内容

 <startup selegacyv2runtimeactivationpolicy="true"> <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" /> </startup> 

如果这不能解决你的问题,那么 – >在项目引用Right Click on DLL ,你会得到错误 – > Select Properties – > Check the Run-time Version – >如果它是v2.0.50727那么我们知道问题。 问题是: – 你有2.0 Version of respective DLL. 解决scheme是: – 您可以从项目引用中delete the respective DLL ,然后从相应的网站download the latest version of DLL's ,并添加最新版本DLL引用的引用,然后它将工作。

我遇到了这个相同的错误,并且花费永远把我build议的启动语句添加到我的解决scheme中的各种configuration文件,试图隔离框架不匹配。 没有工作。 我还将启动信息添加到我的XML模式 。 这也没有帮助。 看看导致问题的实际文件(只能说是“移动或删除”),显示它实际上是许可证编译器(LC)。

删除有问题的licenses.licx文件似乎已经解决了这个问题。

我正在将一些代码从VS 2008迁移到VS 2010时遇到类似的问题。对App.config文件进行更改为我解决了这个问题。

 <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0,Profile=Client" /> </startup> </configuration> 

在此位置添加以下内容C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName:sgen.exe.config(如果您没有find此文件,请创build并添加一个)

  <?xml version ="1.0"?> <configuration> <runtime> <generatePublisherEvidence enabled="false"/> </runtime> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" /> </startup> </configuration> 

此外,我有类库的这个问题,如果任何人有类库添加到您的主要应用程序的问题。 只需添加

 <startup selegacyv2runtimeactivationpolicy="true"> 

给你主要的应用程序,然后由类库采摘。