Mixed mode assembly in .NET 4

时光毁灭记忆、已成空白 提交于 2019-11-26 04:45:50

问题


I wrote a class library in .NET 2.0 for database access some 2 years ago and have been using it all along on .NET 2.0, 3.0 and 3.5.

In the current project I\'m working on (which is a .NET 4.0 application), tried using the old faithful class library and I got the following exception:


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: 

What could be wrong and how do I fix it?


回答1:


The best would probably be to recompile your class library for .NET 4.0 in Visual Studio 2010 (ie. opening up the project, converting it, and changing the target framework.)

If you can't, or won't, do that, then you can try adding the following to your app.config file for your .NET 4.0 application:

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

ie.

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



回答2:


Since your assembly is mixed-mode, it potentially can call managed code from the unmanaged machine code in the assembly. With the new in-process side-by-side CLR version support in .NET 4.0, the runtime doesn't know which CLR version needs to be provided when that happens. You have to tell it that with an app.exe.config file that should look like this:

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



回答3:


Another way: In VB 2010 Express you can open your project and go to the tab Compile and then Advanced Compile Options.... Select .NET Framework 2.0 from the drop-down list named Target framework (all configurations).




回答4:


If you are not getting through even by specifying useLegacyV2RuntimeActivationPolicy="true", you may need to install a setup that is compatible with your OS and .NET version. You can find the same at http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki.

Before installing this setup, uninstall SQLite from installed programs. That will show errors in your code.

If it is not working even after installing compatible setup, you have to remove the reference to your previous DLL file and add a new reference to this compatible DLL file.

When you add a reference to a compatible DLL file you just have to build your project and all your code errors should have gone.




回答5:


You could try opening the old faithful project (Class Library) inside of Visual Studio 2010 and allow it to do the conversion for you.




回答6:


If anyone else still run into this issue, here is my diagnosis: You are using wrong SQLite package. There are many versions of SQLite under http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

For example, if you are targeting .net 4.5 with x86 platorm you should use this file:

under Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.5)

sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.106.0.zip



来源:https://stackoverflow.com/questions/3179028/mixed-mode-assembly-in-net-4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!