แอสเซมบลีโหมดผสมถูกสร้างขึ้นกับเวอร์ชัน 'v2.0.50727′ ของรันไทม์


163

ฉันได้รับข้อยกเว้นต่อไปนี้:

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

ขณะที่ฉันพยายามส่งออกรายงานคริสตัลจากโปรแกรม WPF ของฉัน ...

ฉันได้เพิ่มสิ่งต่อไปนี้ใน app.config แล้ว ...

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
  <NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>

ผู้เชี่ยวชาญคนใดสามารถช่วย ????

การอ้างอิงที่ฉันพบ: http://www.davidmoore.info/2010/12/17/running-net-2-runtime-applications-under-the-net-4-runtime


1
สำคัญ: หากเกิดข้อผิดพลาดกับคอลัมน์ข้อผิดพลาด "ไฟล์" ในขณะ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

1
โปรดทราบว่าคุณอาจไม่เพียงมี "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Tools \" แต่ภายใต้นั้นไดเรกทอรี 'x64' ที่มี sgen ด้วย exe และอาจมีสำเนา / รุ่นอื่น ๆ ของ sgen จำนวนมากทั้งหมดในเส้นทางที่แตกต่างกันขึ้นอยู่กับจำนวน VS และเวอร์ชันที่คุณติดตั้ง
MickeyfAgain_BeforeExitOfSO

@ToolmakerSteve โปรดโพสต์ความคิดเห็นของคุณเป็นคำตอบเพื่อให้ฉันสามารถลงคะแนนได้ ไม่มีคำตอบอื่นที่ช่วยฉัน
Malcolm

คำตอบ:


238

ลองใช้แท็กเริ่มต้นที่แน่นอนนี้ใน app.config ของคุณภายใต้โหนดการกำหนดค่า

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

2
ที่จริงแล้วคุณควรเพิ่มบรรทัดที่ยุ่งยากใน YourApp. ** exe **. config
AntonK

24
นั่นคือ app.config คอมไพเลอร์จะเปลี่ยนชื่อเมื่อสร้าง
Jeff

65
ส่วนที่จำเป็นเท่านั้นคือ useLegacyV2RuntimeActivationPolicy = "true" คุณสามารถออกจากเวอร์ชันเฟรมเวิร์กปัจจุบันของคุณได้
Ben Gripka

3
ฉันสามารถเพิ่มเป็นสองเท่าได้เมื่อเบ็นพูดว่าฉันต้องออกไปอีกครั้งและปัญหาของฉันก็หมด
Mike Malter

1
ลิงค์นี้ควรช่วยให้คุณเข้าใจว่าปัญหาคืออะไรและวิธีแก้ปัญหาสำหรับคุณ: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane

85

ข้อยกเว้นระบุอย่างชัดเจนว่าองค์ประกอบบางอย่างของ. NET 2.0.50727 นั้นรวมอยู่ใน. NET 4.0 ในไฟล์ App.config ให้ใช้สิ่งนี้:

<startup useLegacyV2RuntimeActivationPolicy="true" /> 

มันแก้ไขปัญหาของฉัน


ต้องใช้เครื่องหมายทับปิด<startup useLegacyV2RuntimeActivationPolicy="true" />
Jonn

8

โปรดเพิ่มแอตทริบิวต์ useLegacyV2RuntimeActivationPolicy = "true" ในไฟล์แอปพลิเคชันของคุณ

ค่าเก่า

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
  </startup>

ค่าใหม่

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

มันจะแก้ปัญหาของคุณ.


ยินดีที่ได้ทราบว่ามันได้ผลสำหรับคุณ ขอบคุณสำหรับความคิดเห็นของคุณ!
Brijesh Kumar Tripathi

4

ฉันมีปัญหานี้เหมือนกันกับวิธีแก้ปัญหากลับกัน ฉันได้อัพเกรดโครงการ. NET เป็น. NET 4.0 แล้วเปลี่ยนกลับเป็น. NET 3.5 app.config ในโครงการของฉันยังคงมีสิ่งต่อไปนี้ซึ่งทำให้เกิดข้อผิดพลาดดังกล่าว:

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

วิธีการแก้ไขข้อผิดพลาดสำหรับสิ่งนี้คือเปลี่ยนกลับเป็นข้อมูลอ้างอิง 2.0 ที่เหมาะสมดังนี้:

<startup>
  <supportedRuntime version="v2.0.50727"/>
</startup>

ดังนั้นหากมีการปรับลดรุ่นเกิดข้อผิดพลาดด้านบนคุณอาจต้องสำรองข้อมูลเวอร์ชันที่รองรับ. NET Framework


1

สำหรับฉันนี่ถูกโยนทิ้งเมื่อรันการทดสอบหน่วยภายใต้MSTest(VS2015) ต้องเพิ่ม

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

ใน

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

แอสเซมบลีโหมดผสม MSTest ล้มเหลวใน VS2015


1

การเปิดใช้งานแบบดั้งเดิมจาก app.config ไม่ได้ผลสำหรับฉัน ไม่ทราบสาเหตุแอปพลิเคชันของฉันไม่ได้เปิดใช้งานนโยบายรันไทม์ V2 ฉันพบว่าการทำงานรอบที่นี่

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

public static class RuntimePolicyHelper
{
public static bool LegacyV2RuntimeEnabledSuccessfully { get; private set; }

static RuntimePolicyHelper()
{
    ICLRRuntimeInfo clrRuntimeInfo =
        (ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject(
            Guid.Empty, 
            typeof(ICLRRuntimeInfo).GUID);
    try
    {
        clrRuntimeInfo.BindAsLegacyV2Runtime();
        LegacyV2RuntimeEnabledSuccessfully = true;
    }
    catch (COMException)
    {
        // This occurs with an HRESULT meaning 
        // "A different runtime was already bound to the legacy CLR version 2 activation policy."
        LegacyV2RuntimeEnabledSuccessfully = false;
    }
}

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")]
private interface ICLRRuntimeInfo
{
    void xGetVersionString();
    void xGetRuntimeDirectory();
    void xIsLoaded();
    void xIsLoadable();
    void xLoadErrorString();
    void xLoadLibrary();
    void xGetProcAddress();
    void xGetInterface();
    void xSetDefaultStartupFlags();
    void xGetDefaultStartupFlags();

    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
    void BindAsLegacyV2Runtime();
}
}

1

ลองใช้ไฟล์ config อื่น (ไม่ใช่ไฟล์จากโครงการของคุณ) และ RESTART Visual Studio:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.executionengine.x86.exe.config
(32-bit)

หรือ

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.executionengine.exe.config
(64-bit)

ฉันจะขยายตัวในเรื่องนี้เนื่องจากการหลีกเลี่ยงภาษา.configที่อยู่ในแอปพลิเคชันและโดยทั่วไปจำเป็นสำหรับการกำหนดค่าแอปพลิเคชันเพิ่มเติมจะไม่ใช่วิธีแก้ปัญหาที่ดี
atconway

3
สำหรับการทดสอบหน่วยการเปลี่ยนแปลงการกำหนดค่าจะต้องเกิดขึ้นในไฟล์ vstest.executionengine.x86.exe.config เนื่องจากไฟล์ปฏิบัติการนั้นเป็นกระบวนการหลักของรหัสที่คุณกำลังทดสอบ ปัญหานี้ได้รับการแก้ไขตามที่คาดคะเนใน Visual Studio 2012 SP4 แต่ยังคงมีอยู่ในเครื่องของฉัน
Brandon S

(โปรดทราบว่าคุณไม่จำเป็นต้องรีสตาร์ท Visual Studio เพื่อให้การเปลี่ยนแปลงมีผลคุณควรจะต้องจบงานในกระบวนการ vstest. * เพราะสิ่งเหล่านั้นหยุดทำงานแม้หลังจากการทดสอบเสร็จสมบูรณ์)
Brandon S

ยกระดับสิ่งนี้เพราะนำฉันไปสู่สถานที่จริงที่ฉันต้องเปลี่ยนสิ่งนี้
Janis S.

1

หากข้อผิดพลาดเกิดขึ้นกับคอลัมน์ข้อผิดพลาด "ไฟล์" เป็น 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สร้าง เนื้อหาไฟล์ขั้นต่ำ:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>

ที่มา: SGEN ชุดประกอบโหมดผสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.