Какая «дополнительная конфигурация» необходима для ссылки на сборку смешанного режима .NET 2.0 в проекте .NET 4.0?

497

У меня есть проект, в котором я хотел бы использовать некоторые из возможностей .NET 4.0, но основным требованием является то, что я могу использовать фреймворк System.Data.SQLite, который скомпилирован против 2.X. Я вижу упоминание об этом возможном, например принятом ответе здесь, но я не вижу, как на самом деле добиться этого.

Когда я просто пытаюсь запустить проект 4.0, ссылаясь на сборку 2.X, я получаю:

Комбинация смешанного режима построена по сравнению с версией "v2.0.50727" среды выполнения и не может быть загружена в среду выполнения 4.0 без дополнительных информация о конфигурации.

Что такое "дополнительная конфигурация"?

Показать ещё 1 комментарий
Теги:
.net-4.0
system.data.sqlite

16 ответов

643
Лучший ответ

Чтобы использовать сборку смешанного режима CLR 2.0, вам необходимо изменить файл App.Config, чтобы включить:

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

Ключ - это флаг useLegacyV2RuntimeActivationPolicy. Это заставляет CLR использовать последнюю версию (4.0) для загрузки сборки в смешанном режиме. Без этого это не сработает.

Обратите внимание, что это имеет значение только для сборки смешанного режима (С++/CLI). Вы можете загрузить все управляемые сборки CLR 2 без указания этого в app.config.

  • 0
    @ Reed Я попробовал ваше предложение, но исключение все еще появляется. Я дважды проверил app.config, который копируется в мою папку EXE, и он все еще не работает. Это появляется при использовании log4net. Я не могу найти ничего об этой ошибке re: log4net, кроме как здесь: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , но это мало что говорит. Любые идеи о том, как я могу получить больше информации о моей конкретной проблеме?
  • 0
    @Dave: Это говорит о том, что вы можете просто использовать .NET 4 нативную версию log4net - это кажется лучшим вариантом. Если есть версия .NET 4, используйте ее ...
Показать ещё 6 комментариев
34

Это сообщение форума в Центре разработчиков .NET Framework. Это может дать некоторую проницательность.

(добавьте в файл конфигурации приложения.)

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
  • 2
    Как этот конфиг приложения должен использоваться для сборки NANT?
13

В зависимости от того, какую версию рамки вы планируете, вы можете посмотреть здесь, чтобы получить правильную строку:

http://msdn.microsoft.com/en-us/library/ee517334.aspx

Я потратил много времени, пытаясь понять, почему мой выпуск, предназначенный для клиента .NET 4.0, требует полной версии. Я использовал это в конце:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0.30319" 
               sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
11

Как только вы установите файл app.config, визуальная студия создаст копию в папке bin с именем App.exe.config. Скопируйте это в каталог приложения во время развертывания. Звучит очевидно, но удивительно, что многие пропустили этот шаг. Разработчики WinForms не используются для конфигурационных файлов:).

  • 0
    Другой способ - удалить app.config, а затем добавить новый из Project-> Add-> New item и выбрать General-> File Configuration File (который отличается от простого создания текстового файла app.config).
8

Использование сборок 2.0 и 4.0 не совсем прямо.

ORDER поддерживаемых деклараций фреймов в app.config фактически влияет на исключение смешанного режима. Если вы перевернете заказ объявления, вы получите ошибку смешанного режима. Это и есть цель этого ответа.

Итак, если вы получили ошибку в приложении Windows Forms, попробуйте это, в основном, приложения Windows Forms.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>

Или если проект не является Windows Form. В веб-проекте добавьте это в файл web.config.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>
7

Была ли возможность решить проблему, добавив параметр "запуска с помощью " useLegacyV2RuntimeActivationPolicy ".

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
</startup>

Но ему пришлось поместить его как первый дочерний элемент тега конфигурации в App.config, чтобы он вступил в силу.

<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....
  • 1
    Что случилось с той, у которой version="v2.0" ?
  • 1
    Номер сборки требуется для 2.0, но не для 4.0, поэтому топовая версия неверна. Дно верное.
5

Если вы работаете в веб-службе, а сборка v2.0 - это зависимость, загруженная WcfSvcHost.exe, то вы должны включить

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

in..\Microsoft Visual Studio 10.0\Common7\IDE\ Файл WcfSvcHost.exe.config

Таким образом, Visual Studio сможет отправлять нужную информацию через загрузчик во время выполнения.

5

Выше не работало для меня (я работаю над веб-приложением) - но это было...

Измените файл sgen.exe.config в папке (сначала мне нужно было создать его); C:\Program Files (x86)\Microsoft SDK\Windows\v8.0A\bin\NETFX 4.0 Инструменты (Существует также одна в папке v7.0, но мне не нужно было ее менять, я использую VS2012)

Коненты XML должны выглядеть так (то же самое в предыдущих ответах)

<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>
4

Я столкнулся с этой проблемой, когда изменился на Visual Studio 2015. Ни один из вышеперечисленных ответов не работал для нас. В итоге мы получили его, добавив следующий конфигурационный файл в ВСЕ исполняемые файлы sgen.exe на машине

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

В частности, в этом месте, даже если мы планировали .NET 4.0:

C:\Program Files (x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6 Инструменты

  • 0
    Вы можете быть более конкретным? Вы имеете в виду, что вы добавили эти параметры конфигурации ко всем существующим файлам * .config или что вы создали файл .config для sgen.exe?
  • 0
    Для меня у меня была эта проблема с тестовыми проектами Visual Studio 2015. Этот пост помог мне. devbraindump.wordpress.com/2015/07/29/hello-world
Показать ещё 1 комментарий
3

Я использовал эту конфигурацию:

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

Работал для меня

  • 3
    должно быть v2.0.50727, для v2.0 требуется номер сборки, но для v4.0 номер сборки не требуется
1

У меня возникла эта проблема при обновлении до Visual Studio 2015, и ни одно из решений, размещенных здесь, не имело никакого значения, хотя конфигурация правильная, место для изменения - нет. Я исправил эту проблему, добавив эту конфигурацию:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

Кому: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\TE.ProcessHost.Managed.exe.config

Затем перезапустили Visual Studio.

0

Добавьте в это место следующее: C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64 FileName: sgen.exe.config(Если вы не найдете этот файл, создайте и добавьте его)

 <?xml version ="1.0"?>

<configuration>
 <runtime>        
        <generatePublisherEvidence enabled="false"/>    
    </runtime>

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Выполнение этой проблемы устранено

0

Я столкнулся с аналогичной проблемой при переносе кода с VS 2008 на VS 2010 Внесение изменений в файл App.config решило проблему для меня.

<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"
         sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>
0

Я столкнулся с этой же ошибкой и потратил навсегда добавление предлагаемых операторов запуска в различные файлы конфигурации в моем решении, пытаясь изолировать несоответствие структуры. Ничего не получилось. Я также добавил информацию о запуске в мои XML-схемы. Это тоже не помогло. Глядя на фактический файл, который вызывал проблему (которая только говорила бы, что она была "перемещена или удалена" ), она показала, что это был фактически компилятор лицензии (LC).

Удаление поврежденного файла license.licx, похоже, устранило проблему.

0

Я нашел способ обойти это через 3-4 часа поиска в Интернете. Я добавил следующие

<startup selegacyv2runtimeactivationpolicy="true">
  <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

Если это не решит вашу проблему, тогда → В ссылках на проект Right Click on DLL, где вы получаете ошибку → Select PropertiesCheck the Run-time Version → Если это v2.0.50727, тогда мы знаем проблема. Проблема в следующем: - у вас есть 2.0 Version of respective DLL. Решение: - Вы можете delete the respective DLL из ссылок проекта, а затем download the latest version of DLL's с соответствующего веб-сайта и добавить ссылку на последнюю версию DLL-ссылки, тогда она будет работать.

  • 1
    Это исправит это, потому что вы предполагаете, что последняя версия DLL скомпилирована с более новой версией .NET?
-2

Также у меня была эта проблема с библиотекой классов. Если у кого-то есть проблема с библиотекой классов, добавленной в основное приложение. Просто добавь

<startup useLegacyV2RuntimeActivationPolicy="true">

вам основное приложение, которое затем будет выбрано библиотекой классов.

  • 0
    Это неполное решение. имена в конфиге чувствительны к регистру, и вы забыли U.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню