Apa yang dilakukan 'useLegacyV2RuntimeActivationPolicy' dalam konfigurasi .NET 4?

214

Saat mengonversi proyek yang menggunakan SlimDX, dan karena itu memiliki kode yang tidak dikelola, ke .NET 4.0 saya mengalami kesalahan berikut:

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

Googling sekitar memberi saya solusi, yaitu menambahkan ini ke aplikasi config:

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

Pertanyaan saya adalah, apa yang sedang useLegacyV2RuntimeActivationPolicydilakukan? Saya tidak dapat menemukan dokumentasi tentang hal itu.

Cameron MacFarland
sumber

Jawaban:

165

Setelah sedikit waktu (dan lebih banyak mencari), saya menemukan entri blog ini oleh Jomo Fisher.

Salah satu masalah baru-baru ini yang kita lihat adalah bahwa, karena dukungan untuk runtimes berdampingan, .NET 4.0 telah mengubah cara mengikat ke majelis mode campuran yang lebih tua. Majelis ini, misalnya, yang dikompilasi dari C ++ \ CLI. Rakitan DirectX yang tersedia saat ini adalah mode campuran. Jika Anda melihat pesan seperti ini maka Anda tahu Anda telah mengalami masalah:

Rakitan mode campuran dibuat berdasarkan versi 'v1.1.4322' dari runtime dan tidak dapat dimuat dalam runtime 4.0 tanpa informasi konfigurasi tambahan.

[Menggunting]

Kabar baiknya untuk aplikasi adalah bahwa Anda memiliki opsi untuk kembali ke era .NET 2.0 mengikat untuk majelis ini dengan menetapkan flag app.config seperti:

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

Jadi sepertinya cara runtime memuat majelis mode campuran telah berubah. Saya tidak dapat menemukan detail tentang perubahan ini, atau mengapa itu dilakukan. Tetapi useLegacyV2RuntimeActivationPolicyatribut kembali ke pemuatan CLR 2.0.

Cameron MacFarland
sumber
28
Perlu dicatat di sini bahwa sementara itu marklios answer ( stackoverflow.com/questions/1604663/… ) menyediakan tautan ke penjelasan menyeluruhnya mengenai perubahan ini.
Steffen Opel
1
Penjelasan menyeluruh tentang hal ini dapat ditemukan di MSDN (Meskipun tidak secara eksplisit menyebutkan solusi yang disebutkan di atas): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane
Bagaimana jika saya telah menambahkan ini ke konfigurasi untuk aplikasi saya dan konfigurasi untuk proyek UnitTest saya dan saya masih menerima kesalahan memuat file saat menjalankan tes. Haruskah saya memposting pertanyaan baru?
CodenameCain
126

Berikut adalah penjelasan yang saya tulis baru-baru ini untuk membantu dengan kekosongan informasi tentang atribut ini. http://www.marklio.com/marklio/PermaLink,guid ,ecc34c3c-be44-4422-86b7-900900e451f9.aspx ecc34c3c-be44-4422-86b7-900900e451f9.aspx (tautan Internet Archive Wayback Machine)

Mengutip bit yang paling relevan:

[Instalasi .NET] v4 “tidak berdampak”. Seharusnya tidak mengubah perilaku komponen yang ada saat diinstal.

Atribut useLegacyV2RuntimeActivationPolicy pada dasarnya memungkinkan Anda mengatakan, “Saya memiliki beberapa dependensi pada API shim lama. Tolong buat mereka bekerja seperti dulu sehubungan dengan runtime yang dipilih. "

Mengapa kita tidak menjadikan ini perilaku default? Anda mungkin berpendapat bahwa perilaku ini lebih kompatibel, dan membuat kode porting dari versi sebelumnya jauh lebih mudah. Jika Anda ingat, ini bukan perilaku default karena itu akan membuat pemasangan v4 berdampak, yang dapat merusak aplikasi yang ada yang diinstal pada mesin Anda.

Pos lengkap menjelaskan hal ini secara lebih rinci. Di RTM, dokumen MSDN tentang ini harus lebih baik.

Mark Miller
sumber
user20493, dapatkah Anda menjalankan aplikasi Anda dengan variabel lingkungan COMPlus_CLRLoadLogDir diatur ke direktori kosong tempat aplikasi memiliki akses tulis dan membagikan log yang dihasilkan (harap gosok setiap PII sebelum dibagikan). Mungkin membantu menjelaskan apa yang terjadi. Atribut config mungkin tidak diterapkan pada konteks di mana aplikasi Anda berjalan.
Mark Miller
Tautan ini juga akan membantu Anda memahami apa masalahnya, dan apa solusi yang dilakukan untuk Anda: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane