Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mixed mode assembly in .NET 4

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?

like image 473
Alex Essilfie Avatar asked Jul 05 '10 11:07

Alex Essilfie


People also ask

What is mixed mode assembly?

Mixed mode means that the assembly can run managed and unmanaged code.

What is a managed assembly?

Managed assemblies are located and loaded with an algorithm involving various stages. All managed assemblies except satellite assemblies and WinRT assemblies use the same algorithm.


2 Answers

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> 
like image 50
Lasse V. Karlsen Avatar answered Sep 19 '22 06:09

Lasse V. Karlsen


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> 
like image 38
Hans Passant Avatar answered Sep 21 '22 06:09

Hans Passant