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

526

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

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

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

Какая «дополнительная конфигурация» необходима?

jamone
источник
3
Смотрите также: stackoverflow.com/questions/1604663/…
Михаил
Попробуй это ! http://social.msdn.microsoft.com/Forums/en/clr/thread/58271e39-beca-49ac-90f9-e116fa3dd3c0 Спасибо. Радоваться, веселиться.
ВАЖНО: Если ошибка возникает с ошибкой столбца «Файл» как SGEN, то исправление должно быть в файле sgen.exe.configрядом с sgen.exe. Например, для VS 2015, создать C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Источник: SGEN смешанный режим сборки Минимальное содержание файлов:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Ответы:

686

Чтобы использовать сборку в смешанном режиме 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) для загрузки вашей сборки в смешанном режиме. Без этого не получится.

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

Рид Копси
источник
@ Reed Я попробовал ваше предложение, но по-прежнему появляется исключение. Я дважды проверил app.config, который копируется в мою папку EXE, и он все еще не работает. Это появляется при использовании log4net. Я не могу найти ничего об этой ошибке re: log4net, кроме как здесь: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , но это мало что говорит. Любые идеи о том, как я могу получить больше информации о моей конкретной проблеме?
Дейв
@Dave: Это говорит о том, что вы можете просто использовать .NET 4 нативную версию log4net - это кажется лучшим вариантом. Если есть версия .NET 4, используйте ее ...
Рид Копси
@ Рида нет, и я действительно интерпретировал этот ответ как означающий, что вам придется самостоятельно компилировать log4net. Я думаю, что смогу сделать это, но я бы предпочел просто взять их предварительно скомпилированный двоичный файл и ссылаться на него из моего проекта. Я посмотрю на это еще немного. Но можете ли вы вспомнить, почему изменение app.config не позволяет работать? Я подумал, что, возможно, мне пришлось использовать programname.exe.config, но я тоже попробовал, и это не сработало. По моему ограниченному опыту, любое имя файла делает то же самое.
Дейв
19
Мне помогло поместить эту строку в конфигурационный файл NUnit : <startup useLegacyV2RuntimeActivationPolicy = "true"> <supportRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </ startup>
Филипп Завада
76
Microsoft должна сделать кнопку в диалоге исключений: «Поиск этого сообщения об исключении в
стеке потока
35

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

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

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

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

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 Visual Studio сгенерирует копию в папке bin с именем App.exe.config . Скопируйте это в каталог приложения во время развертывания. Звучит очевидно, но удивительно, что многие люди пропускают этот шаг. Разработчики WinForms не используются для настройки файлов :).

Рахил Хан
источник
Другой способ - удалить 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

Удалось решить проблему, добавив элемент «startup» с набором атрибутов «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>
  ......
....
Deshan
источник
1
Что случилось с тем, с кем version="v2.0"?
SamB
1
Номер сборки требуется для 2.0, но не для 4.0, поэтому топовая версия неверна. Дно верное.
ickydime
5

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

Отредактируйте файл sgen.exe.config в папке (сначала мне пришлось его создать); C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools (в папке 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>
MarkPm
источник
5

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

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

в .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config файл

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

MrBit
источник
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 SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Инструменты

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

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

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

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

OmriSela
источник
3
должно быть v2.0.50727, для v2.0 требуется номер сборки, но для v4.0 номер сборки не требуется
linquize
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

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

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

Если это не решит вашу проблему, то -> В ссылках проекта, Right Click on DLLгде вы получаете ошибку -> Select Properties-> Check 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 последней версии, чтобы она работала.

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

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

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

моно кодиго
источник
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>
Sonali.thecoder
источник
0

Добавьте следующее в этом месте C: \ Program Files (x86) \ Microsoft SDKs \ 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>

Это решило проблему

Muheeb
источник
0

Я использую

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

Это работает, но перед </configuration>тегом de, иначе тег запуска не работает должным образом

RubenP5
источник
-1

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

<startup useLegacyV2RuntimeActivationPolicy="true">

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

Рагхулан Гаутаман
источник
Это неполное решение. имена в конфиге чувствительны к регистру, и вы забыли U.
Чак Ди