'การกำหนดค่าเพิ่มเติม' จำเป็นสำหรับการอ้างอิงแอสเซมบลีโหมดผสม. NET 2.0 ในโครงการ. NET 4.0 ได้อย่างไร


526

ฉันมีโครงการที่ฉันต้องการใช้ฟีเจอร์. NET 4.0 บางตัว แต่ข้อกำหนดหลักคือฉันสามารถใช้เฟรมเวิร์ก System.Data.SQLite ซึ่งคอมไพล์ด้วย 2.X ฉันเห็นการกล่าวถึงความเป็นไปได้เช่นคำตอบที่ยอมรับได้ที่นี่แต่ฉันไม่เห็นวิธีการบรรลุเป้าหมายนี้อย่างแท้จริง

เมื่อฉันลองและเรียกใช้โครงการ 4.0 ของฉันในขณะที่อ้างอิงแอสเซมบลี 2.X ฉันได้รับ:

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

"การกำหนดค่าเพิ่มเติม" อะไรที่จำเป็น?


3
ดูเพิ่มเติมที่: stackoverflow.com/questions/1604663/…
มิคาอิล

ลองมัน ! http://social.msdn.microsoft.com/Forums/en/clr/thread/58271e39-beca-49ac-90f9-e116fa3dd3c0ขอบคุณ มีความสุข.

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

คำตอบ:


686

ในการใช้แอสเซมบลีโหมดผสม CLR 2.0 คุณต้องแก้ไขไฟล์ App.Config ของคุณเพื่อรวม:

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

กุญแจสำคัญคือuseLegacyV2RuntimeActivationPolicyธง สิ่งนี้ทำให้ CLR ใช้เวอร์ชันล่าสุด (4.0) เพื่อโหลดแอสเซมบลีโหมดผสมของคุณ หากปราศจากสิ่งนี้มันจะไม่ทำงาน

โปรดทราบว่าสิ่งนี้สำคัญสำหรับชุดประกอบแบบผสม (C ++ / CLI) เท่านั้น คุณสามารถโหลดจัดการทั้งหมด CLR 2 app.configประกอบโดยไม่ต้องระบุใน


@ กกฉันลองใช้คำแนะนำของคุณแล้ว แต่ข้อยกเว้นยังคงปรากฏขึ้น ฉันได้ตรวจสอบ app.config สองครั้งที่คัดลอกไปยังโฟลเดอร์ EXE ของฉันและมันยังไม่ทำงาน มันเกิดขึ้นเมื่อใช้ log4net ฉันไม่พบสิ่งใดเกี่ยวกับข้อผิดพลาดนี้อีก: log4net ยกเว้นที่นี่: stackoverflow.com/questions/1866735/log4net-and-net-4-0แต่มันไม่ได้พูดอะไรมาก แนวคิดใดบ้างที่ฉันสามารถรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหาเฉพาะของฉันได้
เดฟ

@Dave: นั่นเป็นการบอกว่าคุณสามารถใช้ log4net ในเนทิฟ NET. 4 ซึ่งเป็นตัวเลือกที่ดีที่สุด หากมี. NET 4 เวอร์ชันให้ใช้ ...
Reed Copsey

@ รีดไม่ได้มีอยู่จริงและฉันแปลความหมายคำตอบนั้นจริงๆแล้วคุณต้องรวบรวม log4net ด้วยตัวคุณเอง ฉันเดาว่าฉันสามารถทำได้ แต่ฉันแค่เอาไบนารีที่คอมไพล์แล้วมาอ้างอิงจากโปรเจคของฉัน ฉันจะดูมันเพิ่มเติม แต่คุณสามารถคิดได้ไหมว่าทำไมการเปลี่ยนแอปตั้งค่าไม่ทำงาน ฉันคิดว่าบางทีฉันต้องใช้ programname.exe.config แต่ฉันก็ลองมันเช่นกันและมันก็ใช้ไม่ได้ จากประสบการณ์ที่ จำกัด ของฉันชื่อไฟล์อย่างใดอย่างหนึ่งก็ทำแบบเดียวกัน
เดฟ

19
สิ่งที่ช่วยฉันได้คือการวางบรรทัดนี้ลงในไฟล์กำหนดค่าของ NUnit : <start useLegacyV2RuntimeActivationPolicy = "true"> <supportRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </startup>
Filip Zawada

76
Microsoft ควรสร้างปุ่มในกล่องโต้ตอบข้อยกเว้น: "ค้นหาข้อความข้อยกเว้นนี้ใน stackoverflow"
Davi Fiamenghi

35

ฟอรั่มนี้โพสต์ใน. NET Framework Developer Center มันอาจให้ข้อมูลเชิงลึกบางอย่าง

(เพิ่มลงในไฟล์กำหนดค่าของแอป)

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

2
แอปนี้ควรใช้การกำหนดค่าแอพสำหรับ NANT build อย่างไร
sagar

14

คุณอาจต้องการดูที่นี่เพื่อรับสตริงที่ถูกต้องทั้งนี้ขึ้นอยู่กับเวอร์ชันของเฟรมเวิร์กที่คุณกำลังกำหนดเป้าหมาย:

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

เมื่อคุณตั้งค่าapp.configแฟ้มภาพสตูดิโอจะสร้างสำเนาในโฟลเดอร์ถังชื่อapp.exe.config คัดลอกสิ่งนี้ไปยังไดเร็กทอรีแอปพลิเคชันระหว่างการปรับใช้ ฟังดูชัดเจน แต่ผู้คนจำนวนมากพลาดขั้นตอนนี้ไปอย่างน่าประหลาดใจ นักพัฒนา WinForms ไม่ได้ใช้เพื่อกำหนดค่าไฟล์ :)


อีกวิธีหนึ่งคือการลบ app.config แล้วเพิ่มรายการใหม่จาก Project-> Add-> รายการใหม่และเลือก General-> Application Configuration File (ซึ่งไม่เหมือนกับการสร้างไฟล์ข้อความที่เรียกว่า app.config)
smirkingman

8

การใช้ชุดประกอบ 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

สามารถแก้ไขปัญหาได้โดยการเพิ่มองค์ประกอบ"เริ่มต้น"ด้วยชุดแอตทริบิวต์"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>
  ......
....

1
เกิดอะไรขึ้นกับอันนั้นด้วยversion="v2.0"?
SamB

1
ต้องสร้างหมายเลข Build 2.0 แต่ไม่ใช่สำหรับ 4.0 ดังนั้นเวอร์ชันสูงสุดจึงไม่ถูกต้อง ด้านล่างถูกต้อง
ickydime

5

ข้างต้นใช้งานไม่ได้สำหรับฉัน (ฉันกำลังทำงานกับเว็บแอป) - แต่นี่ทำ ...

แก้ไขไฟล์ sgen.exe.config ในโฟลเดอร์ (ฉันต้องสร้างก่อน); C: \ Program Files (x86) SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 เครื่องมือ (ยังมีหนึ่งในโฟลเดอร์ 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>

5

ถ้าคุณกำลังทำงานในบริการเว็บและแอสเซมบลี v2.0 คือการอ้างอิงที่ถูกโหลดโดยWcfSvcHost.exeคุณต้องรวม

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

ใน .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.configไฟล์

ด้วยวิธีนี้ Visual Studio จะสามารถส่งข้อมูลที่ถูกต้องผ่านตัวโหลดเมื่อรันไทม์


4

ฉันวิ่งเข้าไปในปัญหานี้เมื่อเราเปลี่ยนไปVisual Studio 2015 คำตอบข้างต้นไม่ได้ผลสำหรับเรา ในตอนท้ายเราได้ทำงานโดยเพิ่มไฟล์ config ต่อไปนี้ลงในALL sgen.exe executables บนเครื่อง

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

โดยเฉพาะอย่างยิ่งในตำแหน่งนี้แม้ว่าเราจะกำหนดเป้าหมายไปที่. NET 4.0:

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


คุณเจาะจงมากขึ้นได้ไหม คุณหมายถึงคุณได้เพิ่มตัวเลือกการกำหนดค่านี้ลงในไฟล์ * .config ที่มีอยู่ทั้งหมดหรือว่าคุณสร้างไฟล์. config สำหรับ sgen.exe หรือไม่
Adam Spicer

สำหรับฉันฉันมีปัญหานี้กับโครงการทดสอบ Visual Studio 2015 โพสต์นี้ช่วยฉัน devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer

1
@AdamSpicer เราได้เพิ่มสิ่งนี้ลงในไฟล์. config ทั้งหมดของ sgen.exe ทั้งหมด หากไม่มีอยู่เราสร้างขึ้นใหม่
เรียกใช้ CMD

3

ฉันใช้การกำหนดค่านี้:

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

ทำงานให้ฉัน


3
ควรเป็น v2.0.50727, สำหรับหมายเลขรุ่น v2.0 ที่ต้องการ แต่สำหรับหมายเลขรุ่น v4.0 ไม่จำเป็นต้องใช้
linquize

1

ฉันมีปัญหานี้เมื่ออัปเกรดเป็น Visual Studio 2015 และไม่มีวิธีแก้ไขปัญหาใด ๆ ที่โพสต์ที่นี่สร้างความแตกต่างแม้ว่าการกำหนดค่าจะเป็นตำแหน่งที่เหมาะสมสำหรับการเปลี่ยนแปลงก็ตาม ฉันแก้ไขปัญหานี้โดยเพิ่มการกำหนดค่านี้:

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

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

จากนั้นรีสตาร์ท Visual Studio


0

ฉันพบวิธีแก้ไขหลังจากผ่านไป 3-4 ชั่วโมงของ Google ฉันได้เพิ่มต่อไปนี้

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

หากวิธีนี้ไม่สามารถแก้ปัญหาของคุณได้ -> ในการอ้างอิงโครงการ Right Click on DLLที่คุณได้รับข้อผิดพลาด -> Select Properties-> Check the Run-time Version-> หากเป็นเช่นv2.0.50727นั้นเราจะทราบปัญหา ปัญหาคือ: - คุณกำลังมี2.0 Version of respective DLL. วิธีแก้ปัญหาคือ: - คุณสามารถdelete the respective DLLอ้างอิงโครงการและdownload the latest version of DLL'sจากเว็บไซต์ที่เกี่ยวข้องและเพิ่มการอ้างอิงของการอ้างอิง DLL รุ่นล่าสุดจากนั้นมันจะทำงาน


1
สิ่งนี้จะแก้ไขได้เนื่องจากคุณสมมติว่า DLL รุ่นล่าสุดรวบรวมกับ. NET รุ่นใหม่กว่าหรือไม่
ลูคัส

0

ฉันพบข้อผิดพลาดเดียวกันนี้และใช้เวลาเพิ่มคำสั่งการเริ่มต้นที่แนะนำไปยังไฟล์ config ต่าง ๆ ในโซลูชันของฉันโดยพยายามแยกเฟรมที่ไม่ตรงกัน ไม่มีอะไรทำงาน ฉันยังเพิ่มข้อมูลเริ่มต้นไปที่สกีมา XML ของฉันด้วยด้วย นั่นไม่ได้ช่วยอะไรเช่นกัน ดูไฟล์จริงที่ก่อให้เกิดปัญหา (ซึ่งจะบอกว่าเป็น "ย้ายหรือลบ" เท่านั้น) เปิดเผยว่าจริง ๆ แล้วเป็นลิขสิทธิ์ของคอมไพเลอร์ (LC)

การลบไฟล์ license.licx ที่ละเมิดดูเหมือนว่าได้แก้ไขปัญหาแล้ว


0

ฉันกำลังเผชิญกับปัญหาที่คล้ายกันในขณะที่ย้ายรหัสบางอย่างจาก VS 2008 เป็น VS 2010 การเปลี่ยนแปลงไฟล์ App.config ช่วยแก้ไขปัญหาให้ฉันได้

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

0

เพิ่มต่อไปนี้ที่ตำแหน่งนี้ C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName: sgen.exe.config (หากคุณไม่พบไฟล์นี้ให้สร้างและเพิ่มใหม่)

 <?xml version ="1.0"?>

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

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

การทำเช่นนี้สามารถแก้ไขปัญหาได้


0

ฉันใช้

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

มันใช้งานได้ แต่ก่อน de </configuration>tag มิฉะนั้นแท็กเริ่มต้นทำงานไม่ถูกต้อง


-1

ฉันยังมีปัญหานี้กับไลบรารีคลาสถ้ามีใครมีปัญหากับไลบรารีคลาสที่เพิ่มไปยังแอปพลิเคชันหลักของคุณ เพียงเพิ่ม

<startup useLegacyV2RuntimeActivationPolicy="true">

สำหรับแอปพลิเคชั่นหลักซึ่งจะถูกเลือกโดยไลบรารี่ชั้นเรียน


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