'useLegacyV2RuntimeActivationPolicy' ทำอะไรในการกำหนดค่า. NET 4


214

ในขณะที่แปลงโครงการที่ใช้ SlimDX และดังนั้นจึงมีรหัสที่ไม่มีการจัดการเป็น. NET 4.0 ฉันพบข้อผิดพลาดต่อไปนี้:

แอสเซมบลีโหมดผสมถูกสร้างขึ้นจากเวอร์ชัน 'v2.0.50727' ของรันไทม์และไม่สามารถโหลดในรันไทม์ 4.0 โดยไม่มีข้อมูลการกำหนดค่าเพิ่มเติม

Googling around ให้โซลูชันแก่ฉันซึ่งเพิ่มไปยัง config ของแอพพลิเคชั่น:

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

คำถามของฉันคืออะไรกำลังuseLegacyV2RuntimeActivationPolicyทำอะไร ฉันหาเอกสารเกี่ยวกับเรื่องนี้ไม่พบ

คำตอบ:


165

หลังจากเวลาผ่านไปเล็กน้อย (และการค้นหาเพิ่มเติม) ฉันพบรายการบล็อกนี้โดย Jomo Fisher

หนึ่งในปัญหาล่าสุดที่เราเห็นคือเนื่องจากการสนับสนุน runtimes แบบเคียงข้างกัน. NET 4.0 ได้เปลี่ยนวิธีที่มันเชื่อมโยงกับแอสเซมบลีโหมดผสมแบบเก่า แอสเซมบลีเหล่านี้เป็นตัวอย่างที่ประกอบจาก C ++ \ CLI แอสเซมบลี DirectX ที่พร้อมใช้งานในปัจจุบันคือโหมดผสม หากคุณเห็นข้อความเช่นนี้แสดงว่าคุณทราบถึงปัญหาแล้ว:

แอสเซมบลีโหมดผสมถูกสร้างขึ้นกับเวอร์ชัน 'v1.1.4322' ของรันไทม์และไม่สามารถโหลดได้ในรันไทม์ 4.0 โดยไม่มีข้อมูลการกำหนดค่าเพิ่มเติม

[ตัด]

ข่าวดีสำหรับแอปพลิเคชันคือคุณมีตัวเลือกในการหวนกลับไปสู่. NET 2.0 ยุคที่เชื่อมโยงกับแอสเซมบลีเหล่านี้โดยการตั้งค่าสถานะ app.config ดังนี้:

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

ดังนั้นดูเหมือนว่าวิธีการโหลดรันไทม์แอสเซมบลีโหมดผสมมีการเปลี่ยนแปลง ฉันไม่พบรายละเอียดเกี่ยวกับการเปลี่ยนแปลงนี้หรือทำไมจึงเสร็จ แต่useLegacyV2RuntimeActivationPolicyแอตทริบิวต์จะเปลี่ยนกลับเป็นการโหลด CLR 2.0


28
เป็นที่น่าสังเกตว่าที่นี่ในขณะเดียวกันคำตอบของ marklios ( stackoverflow.com/questions/1604663/ … ) ให้ลิงก์ไปยังคำอธิบายอย่างละเอียดเกี่ยวกับการเปลี่ยนแปลงนี้
Steffen Opel

1
คำอธิบายโดยละเอียดเกี่ยวกับสิ่งนี้สามารถพบได้ใน MSDN (แม้ว่าจะไม่ได้กล่าวถึงวิธีการแก้ปัญหาที่กล่าวข้างต้น): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane

จะเกิดอะไรขึ้นถ้าฉันเพิ่มสิ่งนี้ลงในทั้งการกำหนดค่าสำหรับแอปพลิเคชันของฉันและการกำหนดค่าสำหรับโครงการ UnitTest ของฉันและฉันยังคงได้รับข้อผิดพลาดในการโหลดไฟล์เมื่อทำการทดสอบ ฉันควรโพสต์คำถามใหม่หรือไม่?
CodenameCain

126

นี่คือคำอธิบายที่ฉันได้เขียนเมื่อเร็ว ๆ นี้เพื่อช่วยในความว่างเปล่าของข้อมูลเกี่ยวกับคุณลักษณะนี้ http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (ลิงก์เครื่องเก็บถาวรอินเทอร์เน็ตทางอินเทอร์เน็ต)

หากต้องการอ้างอิงบิตที่เกี่ยวข้องมากที่สุด:

[การติดตั้ง. NET] v4 คือ“ ไม่ส่งผลกระทบ” ไม่ควรเปลี่ยนพฤติกรรมของส่วนประกอบที่มีอยู่เมื่อติดตั้ง

แอ็ตทริบิวต์ useLegacyV2RuntimeActivationPolicy นั้นช่วยให้คุณพูดได้ว่า“ ฉันมีการอ้างอิงบางอย่างเกี่ยวกับ shim APIs ดั้งเดิม โปรดทำให้พวกเขาทำงานในแบบที่พวกเขาเคยทำด้วยความเคารพต่อรันไทม์ที่เลือก”

ทำไมเราไม่ทำให้พฤติกรรมนี้เป็นค่าเริ่มต้น คุณอาจยืนยันว่าพฤติกรรมนี้เข้ากันได้มากกว่าและทำให้การย้ายรหัสจากเวอร์ชันก่อนหน้าง่ายกว่ามาก หากคุณจำได้ว่านี่เป็นพฤติกรรมเริ่มต้นไม่ได้เพราะจะทำให้การติดตั้ง v4 มีผลกระทบซึ่งอาจทำให้แอปที่ติดตั้งอยู่ในเครื่องเสียหาย

โพสต์แบบเต็มอธิบายในรายละเอียดเพิ่มเติม ที่ RTM เอกสาร MSDN ในเรื่องนี้น่าจะดีกว่า


user20493 คุณสามารถเรียกใช้แอปของคุณด้วยตัวแปรสภาพแวดล้อม COMPlus_CLRLoadLogDir ตั้งค่าเป็นไดเรกทอรีว่างเปล่าที่แอพมีการเข้าถึงการเขียนและแชร์บันทึกผลลัพธ์ (โปรดขัดสำหรับ PII ใด ๆ ก่อนแบ่งปัน) มันอาจช่วยอธิบายสิ่งที่เกิดขึ้น แอตทริบิวต์ config อาจไม่สามารถนำไปใช้กับบริบทที่แอปของคุณทำงานอยู่
Mark Miller

ลิงค์นี้ควรช่วยให้คุณเข้าใจว่าปัญหาคืออะไรและวิธีแก้ปัญหาสำหรับคุณ: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.