2010-07-05 16 views
34

Escribí una biblioteca de clases en .NET 2.0 para el acceso a la base de datos hace unos 2 años y lo he estado utilizando todo el tiempo en .NET 2.0, 3.0 y 3.5.Conjunto de modo mixto en .NET 4

En el proyecto actual que estoy trabajando (que es una aplicación .NET 4.0), intentado usar la biblioteca de clases fiel viejo y me dio la siguiente excepción:


 
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: 

¿Qué podría estar mal y cómo lo soluciono?

+0

que vuelve a compilar la biblioteca de clases de .NET 4.0, pero todavía no ha funcionado. ¿Podría ser porque hago referencia a SQLite.NET 1.0.65.0 en la biblioteca de clases? –

+0

IMPORTANTE: Si el error ocurre con la columna de error "Archivo" como 'SGEN', entonces la corrección debe estar en un archivo' sgen.exe.config', al lado de 'sgen.exe'. Por ejemplo, para VS 2015, cree 'C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Tools \ sgen.exe.config'. Origen: [Conjunto de modo mixto SGEN] (https://support.microsoft.com/en-us/help/2572158/sgen-mixed-mode-assembly-is-built-against-version-v2-0-50727-of -the-ru) Contenido mínimo del archivo: '' – ToolmakerSteve

Respuesta

70

La mejor probablemente sería volver a compilar la biblioteca de clases de .NET 4.0 en Visual Studio 2010 (es decir, la apertura. En marcha del proyecto, su conversión, y cambiar el marco de destino.)

Si no se puede, o no quieren hacer eso, entonces puede intentar añadir lo siguiente a su archivo app.config para su aplicación .NET 4.0:

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

decir.

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

en qué ubicación puedo encontrar app.config? – DevThapa

0

Puede intentar abrir el viejo proyecto fiel (Biblioteca de clases) dentro de Visual Studio 2010 y permitirle hacer la conversión por usted.

+0

Actualicé la biblioteca de clases a .NET 4 pero aun así no funcionó. Creo que es porque hago referencia a SQLite.NET en la biblioteca de clases. –

20

Dado que su conjunto es de modo mixto, es posible que invoque el código administrado desde el código de máquina no administrado en el conjunto. Con el nuevo soporte de versión CLR codo a codo en proceso en .NET 4.0, el tiempo de ejecución no sabe qué versión CLR necesita proporcionarse cuando eso sucede. Tienes que decirle que con un archivo app.exe.config que debería tener este aspecto:

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

Espero que esté viendo, pero ¿qué ocurre si el ensamblaje en modo mixto está siendo cargado por una aplicación que no está bajo su control (como por ejemplo Excel.exe por ejemplo). ¿Dónde se debe proporcionar esta información de configuración? – ForeverLearning

+3

En un lugar muy, muy incómodo, Excel.exe.config. Donde cualquiera pueda meterse con eso y matar tu código. Es hora de considerar la reconstrucción del ensamblaje cuando sea necesario. –

+0

Muchas gracias por confirmar. Esa es de hecho la dirección en la que me dirijo. – ForeverLearning

2

Otra forma: En VB 2010 Express se puede abrir el proyecto e ir a la ficha compilar y luego Advanced Compile Options.... Seleccione .NET Framework 2.0 en la lista desplegable llamada Target framework (all configurations).

+3

Pero esto también impide que la biblioteca use cualquier característica de biblioteca de clase .Net 4.0 y ensamblados dirigidos .net 4.0. – Deanna

1

Si no está llegando incluso al especificar useLegacyV2RuntimeActivationPolicy = "true", es posible que deba instalar una configuración que sea compatible con su sistema operativo y su versión .NET. Puede encontrar el mismo en http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki.

Antes de instalar esta configuración, desinstale SQLite de los programas instalados. Eso mostrará errores en tu código.

Si no funciona incluso después de instalar la instalación compatible, debe eliminar la referencia a su archivo DLL anterior y agregar una nueva referencia a este archivo DLL compatible.

Cuando agrega una referencia a un archivo DLL compatible, solo tiene que crear su proyecto y todos sus errores de código deberían haber desaparecido.

0

Si alguien más todavía tiene este problema, aquí está mi diagnóstico: Está utilizando el paquete SQLite incorrecto. Hay muchas versiones de SQLite bajo http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

Por ejemplo, si se dirigen a .NET 4.5 con platorm x86 debe utilizar este archivo:

bajo binarios enlazados estáticamente-precompilados para Windows de 32 bits (.NET Marco 4.5)

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

Cuestiones relacionadas