我有一个项目,我想在其中使用一些 .NET 4.0 功能,但核心要求是我可以使用针对 2.X 编译的 System.Data.SQLite 框架。我看到提到这是可能的,例如 the accepted answer here,但我不知道如何实际实现这一点。
当我在引用 2.X 程序集时尝试运行我的 4.0 项目时,我得到:
混合模式程序集是针对运行时版本“v2.0.50727”构建的,如果没有额外的配置信息,则无法在 4.0 运行时中加载。
需要什么“附加配置”?
SGEN
,则修复需要位于 sgen.exe
旁边的文件 sgen.exe.config
中。例如,对于 VS 2015,创建 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config
。来源:SGEN Mixed mode assembly 最小文件内容:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></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) 程序集很重要。您可以加载所有托管 CLR 2 程序集,而无需在 app.config
中指定。
此 forum post 位于 .NET Framework 开发人员中心。它可能会提供一些见解。
(添加到应用程序的配置文件中。)
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
根据您所针对的框架版本,您可能需要查看此处以获取正确的字符串:
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 开发人员不习惯配置文件 :)。
一起使用 2.0 和 4.0 程序集并不是很简单。
app.config 中支持的框架声明的顺序实际上对抛出混合模式的异常有影响。如果您翻转声明顺序,您将收到混合模式错误。这就是这个答案的目的。
因此,如果您在 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”元素来解决该问题。
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
但必须将其作为配置标签的第一个子元素放在 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>
......
....
version="v2.0"
的那个怎么了?
以上对我没有用(我正在开发一个网络应用程序) - 但这确实......
编辑文件夹中的 sgen.exe.config 文件(我必须先创建一个); C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools(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 时,我遇到了这个问题。上述答案都不适合我们。最后,我们通过将以下配置文件添加到机器上的所有 sgen.exe 可执行文件来使其工作
<?xml version ="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
</startup>
</configuration>
特别是在这个位置,即使我们的目标是 .NET 4.0:
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 工具
我使用了这个配置:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v2.0"/>
<supportedRuntime version="v4.0"/>
</startup>
为我工作
我在升级到 Visual Studio 2015 时遇到了这个问题,这里发布的解决方案都没有任何区别,尽管配置是正确的,但更改的位置不是。我通过添加此配置解决了这个问题:
<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 小时的谷歌搜索后,我找到了解决方法。我添加了以下内容
<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.
解决方案是:- 您可以从项目引用中选择 delete the respective DLL
,然后从相应网站中选择 download the latest version of DLL's
,并添加最新版本 DLL 引用的引用,然后它将起作用。
我遇到了同样的错误,并且永远将建议的启动语句添加到我的解决方案中的各种配置文件中,试图隔离框架不匹配。没有任何效果。我还添加了 startup information to my XML schemas。那也没有帮助。查看导致问题的实际文件(只会说它被“移动或删除”)发现它实际上是许可证编译器(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 文件名:sgen.exe.config(如果找不到此文件,请创建并添加一个)
这样做解决了问题
我用
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
它可以工作,但在 de </configuration>
标记之前,否则启动标记无法正常工作
我的类库也有这个问题,如果有人对添加到主应用程序的类库有问题。只需添加
<startup useLegacyV2RuntimeActivationPolicy="true">
给你的主应用程序,然后由类库选择。