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

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

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

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

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

Ответы [ 16 ]

680 голосов
/ 16 марта 2010

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

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

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

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

34 голосов
/ 16 марта 2010

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

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

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
13 голосов
/ 28 мая 2011

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

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 голосов
/ 11 февраля 2012

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

8 голосов
/ 02 апреля 2012

Совместное использование сборок 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 голосов
/ 12 ноября 2012

удалось решить проблему, добавив "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>
  ......
....
5 голосов
/ 21 апреля 2013

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

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

in .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config file

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

5 голосов
/ 22 марта 2013

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

Отредактируйте файл 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>
4 голосов
/ 22 июля 2015

Я столкнулся с этой проблемой, когда мы изменили на 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 Tools

3 голосов
/ 28 июня 2011

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

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

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

...