Mixed mode assembly in .NET 4
两年前,我在.NET 2.0中编写了一个用于数据库访问的类库,并一直在.NET 2.0、3.0和3.5上使用它。
在我正在处理的当前项目中(这是一个.NET 4.0应用程序),我尝试使用旧的忠实类库,但得到以下异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | System.InvalidOperationException was unhandled Message=An error occurred creating the form. See Exception.InnerException for details. The error is: Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information. Source=SchoolManager StackTrace: at SchoolManager.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 190 at SchoolManager.My.MyProject.MyForms.get_frmGeneric() at SchoolManager.My.MyApplication.OnCreateMainForm() in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\My Project\Application.Designer.vb:line 35 at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) at SchoolManager.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: System.IO.FileLoadException Message=Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information. Source=Dinofage.Data.XpressData StackTrace: at Dinofage.Data.XpressData.ExecuteSelectInternal(String selectCommand) at Dinofage.Data.XpressData.ExecuteSelect(String selectCommand) at SchoolManager.Academics.GetNewAdmissionCode(String academicYear) in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\Modules\Academics.vb:line 89 at SchoolManager.StudentDetail..ctor() in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\UserControls\StudentDetail.vb:line 20 at SchoolManager.frmGeneric.InitializeComponent() in D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\frmGeneric.Designer.vb:line 25 at SchoolManager.frmGeneric..ctor() InnerException: |
可能有什么问题,我该如何解决?
最好的方法可能是在Visual Studio 2010中重新编译.NET 4.0类库(即打开项目、转换项目和更改目标框架)。
如果不能或不愿意这样做,则可以尝试将以下内容添加到.NET 4.0应用程序的app.config文件中:
1 2 3 | <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> |
IE.
1 2 3 4 5 6 | <?xml version ="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> </configuration> |
由于程序集是混合模式,因此它可能会从程序集中的非托管计算机代码调用托管代码。随着.NET 4.0中新的进程内并行CLR版本支持的出现,运行时不知道发生这种情况时需要提供哪个CLR版本。您必须告诉它,对于app.exe.config文件,它应该如下所示:
2另一种方法:在Vb2010 Express中,您可以打开项目,转到选项卡compile,然后转到
如果即使指定uselegacyv2runtimeactivationpolicy="true"也无法通过,则可能需要安装与OS和.NET版本兼容的安装程序。您可以在http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki上找到相同的内容。
安装此安装程序之前,请从已安装的程序中卸载sqlite。这将显示代码中的错误。
如果在安装兼容的安装程序之后仍然无法运行,则必须删除对以前的dll文件的引用,并添加对该兼容dll文件的新引用。
当添加对兼容dll文件的引用时,只需构建项目,所有代码错误都应该消失。
如果还有其他人遇到这个问题,我的诊断是:您使用了错误的sqlite包。在http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki下有许多版本的sqlite
例如,如果要将.NET 4.5作为x86柏拉图的目标,则应使用以下文件:
在32位Windows(.NET Framework 4.5)的预编译静态链接二进制文件下
sqlite-netfx45-static-binary-bundle-win32-2012-1.0.106.0.zip
您可以尝试在Visual Studio 2010中打开旧的忠实项目(类库),并允许它为您进行转换。