Сборка смешанного режима в .NET 4 - PullRequest
36 голосов
/ 05 июля 2010

Я написал библиотеку классов в .NET 2.0 для доступа к базе данных около 2 лет назад и все время использую ее в .NET 2.0, 3.0 и 3.5.

В текущем проекте, над которым я работаю (это приложение .NET 4.0), попытался использовать старую библиотеку верных классов и получил следующее исключение:


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: 

Что может быть не так и как мне это исправить?

Ответы [ 6 ]

72 голосов
/ 05 июля 2010

Лучше всего было бы перекомпилировать библиотеку классов для .NET 4.0 в Visual Studio 2010 (т. Е. Открыть проект, преобразовать его и изменить целевой фреймворк.)или нет, тогда вы можете попробовать добавить следующее в файл app.config для вашего приложения .NET 4.0:

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

, т.е.

<?xml version ="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
    </startup>
</configuration>
21 голосов
/ 05 июля 2010

Поскольку ваша сборка работает в смешанном режиме, она потенциально может вызывать управляемый код из неуправляемого машинного кода в сборке.С новой поддержкой параллельной версии CLR в .NET 4.0 среда выполнения не знает, какую версию CLR необходимо предоставить, когда это произойдет.Вы должны сказать, что с файлом app.exe.config, который должен выглядеть следующим образом:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
2 голосов
/ 08 ноября 2012

Другой способ: в VB 2010 Express вы можете открыть свой проект и перейти на вкладку Compile, а затем Advanced Compile Options....Выберите .NET Framework 2.0 из раскрывающегося списка с именем Target framework (all configurations).

1 голос
/ 20 января 2014

Если вы не справляетесь даже с указанием useLegacyV2RuntimeActivationPolicy = "true", вам может потребоваться установить установку, совместимую с вашей ОС и версией .NET.Вы можете найти то же самое в http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki.

Перед установкой этой установки удалите SQLite из установленных программ.Это покажет ошибки в вашем коде.

Если он не работает даже после установки совместимой установки, необходимо удалить ссылку на предыдущий файл DLL и добавить новую ссылку на этот совместимый файл DLL.

Когда вы добавляете ссылку на совместимый файл DLL, вам просто нужно создать свой проект, и все ваши ошибки в коде должны были исчезнуть.

0 голосов
/ 08 ноября 2017

Если кто-то еще столкнулся с этой проблемой, вот мой диагноз: вы используете неправильный пакет SQLite.Существует много версий SQLite в http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

Например, если вы ориентируетесь на .net 4.5 с платформой x86, вам следует использовать этот файл:

в Precompiled Static-Linked Binaries для 32-битная Windows (.NET Framework 4.5)

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

0 голосов
/ 05 июля 2010

Вы можете попробовать открыть старый верный проект (Библиотека классов) внутри Visual Studio 2010 и позволить ему выполнить преобразование за вас.

...