Apa 'konfigurasi tambahan' yang diperlukan untuk referensi perakitan mode campuran .NET 2.0 dalam proyek .NET 4.0?

526

Saya punya proyek di mana saya ingin menggunakan beberapa fitur .NET 4.0 tetapi persyaratan inti adalah bahwa saya dapat menggunakan kerangka kerja System.Data.SQLite yang dikompilasi dengan 2.X. Saya melihat penyebutan ini menjadi mungkin seperti jawaban yang diterima di sini, tetapi saya tidak melihat bagaimana cara mencapainya.

Ketika saya hanya mencoba dan menjalankan proyek 4.0 saya sambil mereferensikan perakitan 2.X saya mendapatkan:

Rakitan mode campuran dibangun melawan versi 'v2.0.50727' dari runtime dan tidak dapat dimuat dalam runtime 4.0 tanpa informasi konfigurasi tambahan.

Apa "konfigurasi tambahan" yang diperlukan?

jamone
sumber
PENTING: Jika kesalahan terjadi dengan kolom kesalahan "File" sebagai SGEN, maka perbaikan harus dalam file sgen.exe.config, di sebelah sgen.exe. Misalnya, untuk VS 2015, buat C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Sumber: Rakitan mode campuran<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
SGEN

Jawaban:

686

Untuk menggunakan perakitan mode campuran CLR 2.0 , Anda perlu memodifikasi file App.Config Anda untuk memasukkan:

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

Kuncinya adalah useLegacyV2RuntimeActivationPolicybendera. Ini menyebabkan CLR menggunakan versi terbaru (4.0) untuk memuat rakitan mode campuran Anda. Tanpa ini, itu tidak akan berhasil.

Perhatikan bahwa ini hanya penting untuk rakitan mode campuran (C ++ / CLI). Anda dapat memuat semua majelis CLR 2 yang dikelola tanpa menentukan ini dalam app.config.

Reed Copsey
sumber
@Reed Saya sudah mencoba saran Anda, tetapi pengecualian masih muncul. Saya telah memeriksa ulang app.config yang disalin ke folder EXE saya dan masih tidak berfungsi. Muncul saat menggunakan log4net. Saya tidak dapat menemukan apa pun tentang kesalahan ini: log4net kecuali untuk di sini: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , tetapi tidak banyak bicara. Adakah ide tentang bagaimana saya bisa mendapatkan informasi lebih lanjut tentang masalah khusus saya?
Dave
@ Dave: Itu menunjukkan bahwa Anda bisa menggunakan versi .NET 4 asli dari log4net - yang sepertinya merupakan pilihan terbaik. Jika ada versi .NET 4, gunakan itu ...
Reed Copsey
@ Cepat tidak ada, dan saya benar-benar menafsirkan jawaban itu berarti bahwa Anda harus mengkompilasi log4net sendiri. Saya kira saya bisa melakukan itu, tetapi saya lebih suka mengambil binary yang telah dikompilasi dan referensi dari proyek saya. Saya akan memeriksanya lagi. Tetapi bisakah Anda memikirkan mengapa mengubah app.config tidak membuatnya berfungsi? Saya pikir mungkin saya harus menggunakan programname.exe.config, tetapi saya mencobanya juga dan tidak berhasil. Dalam pengalaman saya yang terbatas, kedua nama file melakukan hal yang sama.
Dave
19
Apa yang membantu saya adalah menempatkan baris ini ke file konfigurasi NUnit : <startup useLegacyV2RuntimeActivationPolicy = "true"> <didukungRuntime versi = "v4.0" /> <diperlukanRuntime versi = "v4.0.20506" /> </startup>
Filip Zawada
76
Microsoft harus membuat tombol dalam dialog pengecualian: "Cari pesan pengecualian ini di stackoverflow"
Davi Fiamenghi
35

Posting forum ini di Pusat Pengembang .NET Framework. Mungkin memberikan beberapa wawasan.

(Tambahkan ke file konfigurasi aplikasi.)

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>
JasCav
sumber
2
Bagaimana konfigurasi aplikasi ini harus digunakan untuk membangun NANT?
sagar
14

Bergantung pada versi kerangka kerja apa yang Anda targetkan, Anda mungkin ingin melihat di sini untuk mendapatkan string yang benar:

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

Saya menghabiskan waktu berjam-jam untuk mencari tahu mengapa saya menargetkan rilis. Net 4.0 klien membutuhkan versi lengkap. Saya menggunakan ini pada akhirnya:

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

Setelah Anda mengatur file app.config , studio visual akan menghasilkan salinan di folder bin bernama App.exe.config . Salin ini ke direktori aplikasi selama penerapan. Kedengarannya jelas tetapi mengejutkan banyak orang melewatkan langkah ini. Pengembang WinForms tidak digunakan untuk mengkonfigurasi file :).

Raheel Khan
sumber
Cara lain adalah menghapus app.config dan kemudian menambahkan yang baru dari Project-> Add-> Item baru dan pilih General-> Application Configuration File (yang tidak sama dengan hanya membuat file teks yang disebut app.config)
smirkingman
8

Menggunakan rakitan 2.0 dan 4.0 secara bersamaan tidak cukup mudah.

ORDER dari deklarasi framework yang didukung di app.config sebenarnya memiliki efek pada pengecualian mode campuran yang dilemparkan. Jika Anda membalik urutan deklarasi Anda akan mendapatkan kesalahan mode campuran. Inilah tujuan dari jawaban ini.

Jadi jika Anda mendapatkan kesalahan dalam aplikasi Windows Forms, coba ini, sebagian besar aplikasi Windows Forms.

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

Atau jika proyek tersebut bukan Windows Form. Dalam proyek Web, tambahkan ini ke file web.config.

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

Mampu menyelesaikan masalah dengan menambahkan elemen "startup" dengan set atribut "useLegacyV2RuntimeActivationPolicy" .

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

Tetapi harus menempatkannya sebagai elemen anak pertama dari tag konfigurasi di App.config agar dapat berfungsi .

<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....
Deshan
sumber
1
Apa yang terjadi dengan orang itu version="v2.0"?
SamB
1
Nomor build diperlukan untuk 2.0 tetapi tidak untuk 4.0 sehingga versi teratas tidak benar. Bawah benar.
ickydime
5

Di atas tidak bekerja untuk saya (saya sedang mengerjakan aplikasi web) - tetapi ini ...

Edit file sgen.exe.config di folder (saya harus membuatnya terlebih dahulu); C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools (Ada juga satu di folder v7.0, tapi saya tidak perlu mengubahnya, saya menggunakan VS2012)

Conents dari XML akan terlihat seperti ini (sama dengan jawaban sebelumnya)

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

Jika Anda bekerja di layanan web dan perakitan v2.0 adalah ketergantungan yang telah dimuat oleh WcfSvcHost.exe maka Anda harus menyertakan

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

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

Dengan cara ini, Visual Studio akan dapat mengirim informasi yang tepat melalui loader saat runtime.

MrBit
sumber
4

Saya mengalami masalah ini ketika kami berubah ke Visual Studio 2015 . Tidak satu pun dari jawaban di atas bekerja untuk kita. Pada akhirnya kami berhasil dengan menambahkan file konfigurasi berikut ke SEMUA executable sgen.exe pada mesin

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

Khususnya di lokasi ini, bahkan ketika kami menargetkan .NET 4.0:

C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Alat

Jalankan CMD
sumber
Bisakah Anda lebih spesifik? Maksud Anda menambahkan opsi konfigurasi ini ke semua file * .config yang ada atau bahwa Anda membuat file .config untuk sgen.exe?
Adam Spicer
Bagi saya, saya mengalami masalah ini dengan Visual Studio 2015 Test Projects. Posting ini membantu saya. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer
1
@AdamSpicer Kami menambahkan ini ke semua file .config dari semua sgen.exe. Jika tidak ada, kami buat satu.
Jalankan CMD
3

Saya menggunakan konfigurasi ini:

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

Bekerja untukku

OmriSela
sumber
3
harus v2.0.50727, untuk nomor build v2.0 diperlukan, tetapi untuk nomor build v4.0 tidak diperlukan
linquize
1

Saya punya masalah ini ketika memutakhirkan ke Visual Studio 2015 dan tidak ada solusi yang diposting di sini membuat perbedaan, meskipun konfigurasi benar lokasi untuk perubahan tidak. Saya memperbaiki masalah ini dengan menambahkan konfigurasi ini:

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

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

Kemudian restart Visual Studio.

Michael Armitage
sumber
0

Saya menemukan jalan keluar setelah 3-4 jam googling. Saya telah menambahkan yang berikut ini

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

Jika ini tidak menyelesaikan masalah Anda kemudian -> Dalam Referensi Proyek di Right Click on DLLmana Anda mendapatkan kesalahan -> Select Properties-> Check the Run-time Version-> Jika itu v2.0.50727maka kita tahu masalahnya. Masalahnya adalah: - Anda mengalami 2.0 Version of respective DLL. Solusi adalah: - Anda dapat delete the respective DLLdari referensi Proyek dan kemudian download the latest version of DLL'sdari situs web yang sesuai dan menambahkan referensi dari referensi DLL versi terbaru maka itu akan berfungsi.

venu
sumber
1
Ini akan memperbaikinya karena Anda mengasumsikan versi terbaru dari DLL dikompilasi dengan versi .NET yang lebih baru?
Lucas
0

Saya mengalami kesalahan yang sama ini, dan menghabiskan selamanya menambahkan pernyataan startup yang disarankan ke berbagai file konfigurasi dalam solusi saya, mencoba untuk mengisolasi kerangka ketidakcocokan. Tidak ada yang berhasil. Saya juga menambahkan informasi startup ke skema XML saya . Itu juga tidak membantu. Melihat file aktual yang menyebabkan masalah (yang hanya akan mengatakan itu "dipindahkan atau dihapus") mengungkapkan sebenarnya itu adalah Compiler Lisensi (LC).

Menghapus file lisensi.licx yang menyinggung tampaknya telah menyelesaikan masalah.

mono código
sumber
0

Saya menghadapi masalah serupa saat memigrasi beberapa kode dari VS 2008 ke VS 2010 Membuat perubahan pada file App.config menyelesaikan masalah untuk saya.

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

Tambahkan berikut ini di lokasi ini C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 Nama File: sgen.exe.config (Jika Anda tidak menemukan file ini, buat dan tambahkan satu)

 <?xml version ="1.0"?>

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

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Melakukan ini menyelesaikan masalah

Muheeb
sumber
0

Saya menggunakan

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

Ini berfungsi tetapi tepat sebelum de </configuration>tag jika tidak, tag startup tidak berfungsi dengan baik

RubenP5
sumber
-1

Juga saya punya masalah dengan perpustakaan kelas, Jika ada yang punya masalah dengan perpustakaan kelas ditambahkan ke aplikasi utama Anda. Cukup tambahkan

<startup useLegacyV2RuntimeActivationPolicy="true">

untuk Anda aplikasi utama yang kemudian akan dipilih oleh perpustakaan kelas.

Raghulan Gowthaman
sumber
Ini adalah solusi yang tidak lengkap. nama-nama dalam konfigurasi peka huruf besar-kecil, dan Anda lupa huruf A.
Chuck Dee