'Cấu hình bổ sung' nào là cần thiết để tham chiếu cụm chế độ hỗn hợp .NET 2.0 trong dự án .NET 4.0?


526

Tôi có một dự án trong đó tôi muốn sử dụng một số tính năng .NET 4.0 nhưng yêu cầu cốt lõi là tôi có thể sử dụng khung System.Data.SQLite được biên dịch dựa trên 2.X. Tôi thấy đề cập đến điều này là có thể, chẳng hạn như câu trả lời được chấp nhận ở đây nhưng tôi không thấy làm thế nào để thực sự đạt được điều này.

Khi tôi chỉ thử và chạy dự án 4.0 của mình trong khi tham khảo cụm 2.X tôi nhận được:

Việc lắp ráp chế độ hỗn hợp được xây dựng dựa trên phiên bản 'v2.0.50727' của thời gian chạy và không thể được tải trong thời gian chạy 4.0 mà không có thông tin cấu hình bổ sung.

"Cấu hình bổ sung" là cần thiết?




QUAN TRỌNG: Nếu lỗi xảy ra với cột lỗi "Tệp" SGEN, thì sửa lỗi cần phải nằm trong một tệp sgen.exe.config, bên cạnh sgen.exe. Ví dụ, đối với VS 2015, hãy tạo C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Nguồn: sgen chế độ hỗn hợp lắp ráp nội dung tập tin tối thiểu:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Câu trả lời:


686

Để sử dụng cụm chế độ hỗn hợp CLR 2.0 , bạn cần sửa đổi tệp App.Config của mình để bao gồm:

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

Chìa khóa là useLegacyV2RuntimeActivationPolicycờ. Điều này khiến CLR sử dụng phiên bản mới nhất (4.0) để tải cụm chế độ hỗn hợp của bạn. Không có cái này, nó sẽ không hoạt động.

Lưu ý rằng điều này chỉ quan trọng đối với các cụm chế độ hỗn hợp (C ++ / CLI). Bạn có thể tải tất cả các cụm CLR 2 được quản lý mà không chỉ định điều này app.config.


@Reed Tôi đã thử đề xuất của bạn, nhưng ngoại lệ vẫn bật lên. Tôi đã kiểm tra lại app.config được sao chép vào thư mục EXE của tôi và nó vẫn không hoạt động. Nó xuất hiện khi sử dụng log4net. Tôi không thể tìm thấy bất cứ điều gì về lỗi này: log4net ngoại trừ ở đây: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , nhưng nó không nói gì nhiều. Bất kỳ ý tưởng về làm thế nào tôi có thể nhận thêm thông tin về vấn đề cụ thể của tôi?
Dave

@Dave: Điều đó cho thấy rằng bạn chỉ có thể sử dụng phiên bản .NET 4 của log4net - có vẻ như là tùy chọn tốt nhất. Nếu có phiên bản .NET 4, hãy sử dụng nó ...
Reed Copsey

@Reed không có, và tôi thực sự đã giải thích câu trả lời đó có nghĩa là bạn sẽ phải tự biên dịch log4net. Tôi đoán tôi có thể làm điều đó, nhưng tôi chỉ muốn lấy nhị phân được biên dịch sẵn của họ và tham chiếu nó từ dự án của tôi. Tôi sẽ xem xét thêm về nó. Nhưng bạn có thể nghĩ tại sao thay đổi app.config không làm cho nó hoạt động không? Tôi nghĩ có lẽ tôi phải sử dụng chương trình.exe .config, nhưng tôi cũng đã thử và nó không hoạt động. Theo kinh nghiệm hạn chế của tôi, tên tệp cũng làm điều tương tự.
Dave

19
Điều đã giúp tôi là đưa dòng này vào tệp cấu hình của NUnit : <startup useLegacyV2R.78ActivationPolicy = "true"> <hỗ trợR phiên bản = "v4.0" /> <requiredR.78 phiên bản = "v4.0.20506" /> </ startup>
Filip Zawada

76
Microsoft nên tạo một nút trong hộp thoại ngoại lệ: "Tìm kiếm thông báo ngoại lệ này trên stackoverflow"
Davi Fiamenghi 18/03/13

35

Diễn đàn này đăng trên Trung tâm nhà phát triển .NET Framework. Nó có thể cung cấp một số cái nhìn sâu sắc.

(Thêm vào tệp cấu hình của ứng dụng.)

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

2
Cấu hình ứng dụng này nên được sử dụng cho bản dựng NANT như thế nào?
sagar

14

Tùy thuộc vào phiên bản của khung mà bạn nhắm mục tiêu, bạn có thể muốn xem ở đây để có được chuỗi chính xác:

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

Tôi đã lãng phí hàng giờ để cố gắng tìm ra lý do tại sao khách hàng phát hành của tôi nhắm mục tiêu .Net 4.0 yêu cầu phiên bản đầy đủ. Tôi đã sử dụng điều này cuối cùng:

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

11

Khi bạn đặt tệp app.config , studio trực quan sẽ tạo một bản sao trong thư mục bin có tên App.exe.config . Sao chép này vào thư mục ứng dụng trong khi triển khai. Nghe có vẻ rõ ràng nhưng đáng ngạc nhiên là rất nhiều người bỏ lỡ bước này. Các nhà phát triển WinForms không được sử dụng để cấu hình các tệp :).


Một cách khác là xóa app.config và sau đó thêm một cái mới từ Project-> Add-> New item và chọn General-> Application Configuration File (không giống như chỉ tạo một tệp văn bản có tên app.config)
smirkingman

8

Sử dụng các phiên bản 2.0 và 4.0 với nhau không hoàn toàn đơn giản.

ĐẶT HÀNG của các khai báo khung được hỗ trợ trong app.config thực sự có ảnh hưởng đến ngoại lệ của chế độ hỗn hợp bị ném. Nếu bạn lật thứ tự khai báo, bạn sẽ gặp lỗi chế độ hỗn hợp. Đây là mục đích của câu trả lời này.

Vì vậy, nếu bạn gặp lỗi trong ứng dụng Windows Forms, hãy thử điều này, chủ yếu là các ứng dụng Windows Forms.

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

Hoặc nếu dự án không phải là Windows Form. Trong một dự án Web, hãy thêm nó vào tệp web.config.

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

7

Đã có thể giải quyết vấn đề bằng cách thêm phần tử "khởi động" với tập thuộc tính "useLegacyV2R.78ActivationPolicy" .

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

Nhưng phải đặt nó làm thành phần con đầu tiên của thẻ cấu hình trong App.config để nó có hiệu lực .

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

1
Điều gì đã xảy ra với một người với version="v2.0"?
SamB

1
Số bản dựng được yêu cầu cho 2.0 nhưng không phải cho 4.0 nên phiên bản hàng đầu không chính xác. Dưới cùng là chính xác.
ickydime

5

Những điều trên không làm việc cho tôi (tôi đang làm việc trên một ứng dụng web) - nhưng điều này đã ...

Chỉnh sửa tệp sgen.exe.config trong thư mục (trước tiên tôi phải tạo một tệp); C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Công cụ (Cũng có một trong thư mục v7.0, nhưng tôi không cần thay đổi cái đó, tôi đang sử dụng VS2012)

Các khái niệm của XML sẽ trông như thế này (giống như trong các câu trả lời trước)

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

5

Nếu bạn đang làm việc trong một dịch vụ web và lắp ráp v2.0 là một phụ thuộc đã được tải bởi WcfSvchost.exe thì bạn phải bao gồm

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

trong .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvchost.exe.config tệp

Bằng cách này, Visual Studio sẽ có thể gửi thông tin đúng thông qua trình tải khi chạy.


4

Tôi gặp vấn đề này khi chúng tôi đổi sang Visual Studio 2015 . Không có câu trả lời nào ở trên làm việc cho chúng tôi. Cuối cùng, chúng tôi đã làm cho nó hoạt động bằng cách thêm tệp cấu hình sau vào TẤT CẢ các tệp thực thi sgen.exe trên máy

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

Đặc biệt ở vị trí này, ngay cả khi chúng tôi nhắm mục tiêu .NET 4.0:

C: \ Tệp chương trình (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Công cụ


Bạn có thể cụ thể hơn không? Bạn có nghĩa là bạn đã thêm tùy chọn cấu hình này cho tất cả các tệp * .config hiện có hoặc bạn đã tạo tệp .config cho sgen.exe?
Adam Spicer

Đối với tôi, tôi đã gặp vấn đề này với Dự án thử nghiệm Visual Studio 2015. Bài này đã giúp tôi. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer

1
@AdamSpicer Chúng tôi đã thêm phần này vào tất cả các tệp .config của tất cả các sgen.exe. Nếu không tồn tại, chúng tôi tạo ra một.
Chạy CMD

3

Tôi đã sử dụng cấu hình này:

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

Đã làm cho tôi


3
nên là v2.0.50727, đối với số bản dựng v2.0 là bắt buộc, nhưng đối với số bản dựng v4.0 là không cần thiết
linquize

1

Tôi đã gặp vấn đề này khi nâng cấp lên Visual Studio 2015 và không có giải pháp nào được đăng ở đây có bất kỳ sự khác biệt nào, mặc dù cấu hình đúng là vị trí cho sự thay đổi là không. Tôi đã khắc phục sự cố này bằng cách thêm cấu hình này:

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

Tới: C: \ Tệp chương trình (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ TE.Processhost.Managed.exe.config

Sau đó khởi động lại Visual Studio.


0

Tôi tìm thấy một cách xung quanh này sau 3-4 giờ googling. Tôi đã thêm vào như sau

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

Nếu điều này không giải quyết được vấn đề của bạn thì -> Trong Tài liệu tham khảo dự án Right Click on DLLnơi bạn gặp lỗi -> Select Properties-> Check the Run-time Version-> Nếu đó là v2.0.50727thì chúng tôi biết vấn đề. Vấn đề là: - bạn đang có 2.0 Version of respective DLL. Giải pháp là: - Bạn có thể delete the respective DLLtừ các tham chiếu Dự án và sau đó download the latest version of DLL'stừ trang web tương ứng và thêm tham chiếu của tham chiếu DLL phiên bản mới nhất sau đó nó sẽ hoạt động.


1
Điều này sẽ khắc phục vì bạn cho rằng phiên bản mới nhất của DLL được biên dịch dựa trên phiên bản .NET mới hơn?
Lucas

0

Tôi đã gặp phải lỗi tương tự và đã dành mãi mãi thêm các câu lệnh khởi động được đề xuất vào các tệp cấu hình khác nhau trong giải pháp của mình, cố gắng cô lập khung không khớp. Không có gì làm việc. Tôi cũng đã thêm thông tin khởi động vào các lược đồ XML của mình . Điều đó cũng không giúp được gì. Nhìn vào tệp thực sự gây ra sự cố (chỉ nói rằng nó đã bị "di chuyển hoặc bị xóa") cho thấy nó thực sự là Trình biên dịch giấy phép (LC).

Xóa tệp giấy phép vi phạm.licx dường như đã khắc phục sự cố.


0

Tôi đã gặp phải một vấn đề tương tự trong khi di chuyển một số mã từ VS 2008 sang VS 2010 Việc thay đổi tệp App.config đã giải quyết vấn đề cho tôi.

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

0

Thêm vào sau tại vị trí này C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName: sgen.exe.config (Nếu bạn không tìm thấy tệp này, hãy tạo và thêm một tệp)

 <?xml version ="1.0"?>

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

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Làm điều này giải quyết vấn đề


0

Tôi sử dụng

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

Nó hoạt động nhưng ngay trước khi de </configuration>tag nếu không thẻ khởi động không hoạt động đúng


-1

Ngoài ra tôi có vấn đề này với thư viện lớp, Nếu có ai gặp vấn đề với thư viện lớp được thêm vào ứng dụng chính của bạn. Chỉ cần thêm

<startup useLegacyV2RuntimeActivationPolicy="true">

cho bạn ứng dụng chính mà sau đó sẽ được thư viện lớp chọn.


Đây là một giải pháp không đầy đủ. các tên trong cấu hình có phân biệt chữ hoa chữ thường và bạn đã quên một chữ U
Chuck Dee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.