.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