.NET 4中的混合模式程序集
大约两年前,我在.NET 2.0中编写了一个用于数据库访问的类库,并一直在.NET 2.0,3.0和3.5上使用它。
在当前正在进行的项目(.NET 4.0应用程序)中,尝试使用旧的忠实类库,并得到以下exception:
System.InvalidOperationException是未处理的 消息=创build表单时发生错误。 有关详细信息,请参阅Exception.InnerException。 错误是:混合模式程序集是针对运行时版本“v2.0.50727”构build的 并且不能在没有附加configuration信息的情况下在4.0运行时加载。 来源= SchoolManager 堆栈跟踪: at SchoolManager.My.MyProject.MyForms.Create__Instance __ [T](T Instance)in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 190 在SchoolManager.My.MyProject.MyForms.get_frmGeneric() D:\ Alex \ Documents \ Visual Studio 2008 \ Projects \ School Manager \ SchoolManager \ My Project \ Application.Designer.vb中的SchoolManager.My.MyApplication.OnCreateMainForm()中:第35行 在Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() 在Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() 在Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String [] commandLine) at SchoolManager.My.MyApplication.Main(String [] Args)in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81 在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args) 在System.AppDomain.ExecuteAssembly(stringassemblyFile,证据assemblySecurity,string[]参数) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallbackcallback,对象状态,布尔ignoreSyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallbackcallback,对象状态) 在System.Threading.ThreadHelper.ThreadStart() InnerException:System.IO.FileLoadException 消息=混合模式程序集是针对版本“v2.0.50727”构build的 运行时,不能在4.0运行时加载而不需要额外的 configuration信息。 来源= Dinofage.Data.XpressData 堆栈跟踪: 在Dinofage.Data.XpressData.ExecuteSelectInternal(String selectCommand) 在Dinofage.Data.XpressData.ExecuteSelect(String selectCommand) D:\ Alex \ Documents \ Visual Studio 2008 \ Projects \ School Manager \ SchoolManager \ Modules \ Academics.vb:89行中的SchoolManager.Academics.GetNewAdmissionCode(String academicYear) 在D:\ Alex \ Documents \ Visual Studio 2008 \ Projects \ School Manager \ SchoolManager \ UserControls \ StudentDetail.vb中的SchoolManager.StudentDetail..ctor()中:第20行 D:\ Alex \ Documents \ Visual Studio 2008 \ Projects \ School Manager \ SchoolManager \ frmGeneric.Designer.vb中的SchoolManager.frmGeneric.InitializeComponent()中:第25行 在SchoolManager.frmGeneric..ctor() 的InnerException:
什么可能是错的,我该如何解决?
最好的可能是在Visual Studio 2010中重新编译.NET 4.0的类库(即打开项目,转换项目,更改目标框架)。
如果你不能,或者不能,那么你可以尝试将下面的代码添加到你的.NET 4.0应用程序的app.config文件中:
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup>
即。
<?xml version ="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> </configuration>
由于您的程序集是混合模式,因此可能会从程序集中的非托pipe机器代码调用托pipe代码。 在.NET 4.0中支持新的进程内并行CLR版本时,运行时不知道在发生这种情况时需要提供哪个CLR版本。 你必须告诉它,应该看起来像这样的app.exe.config文件:
<configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> </configuration>
另一种方法:在VB 2010 Express中,您可以打开项目,然后转到选项卡编译,然后selectAdvanced Compile Options...
从名为Target framework (all configurations)
的下拉列表中select.NET Framework 2.0
Target framework (all configurations)
。
如果您甚至没有通过指定useLegacyV2RuntimeActivationPolicy =“true”,您可能需要安装一个与您的操作系统和.NET版本兼容的设置。 你可以在http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wikifind相同的内容。;
在安装此设置之前,从安装的程序中卸载SQLite。 这将在您的代码中显示错误。
如果即使在安装兼容的安装程序后仍无法正常工作,则必须删除对以前的DLL文件的引用,并为此兼容的DLL文件添加一个新的引用。
当您添加一个兼容的DLL文件的引用,你只需要build立你的项目,所有的代码错误应该已经没有了。
您可以尝试在Visual Studio 2010中打开旧的忠实项目(Class Library),并允许它为您进行转换。
如果其他人仍然遇到这个问题,这里是我的诊断:你正在使用错误的SQLite包。 在http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki下有许多版本的SQLite
例如,如果您使用x86 Platorm针对.net 4.5,则应使用以下文件:
在32位Windows的预编译静态链接二进制文件下(.NET Framework 4.5)
sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.106.0.zip