Bir .NET 4.0 projesinde .NET 2.0 karma mod derlemesine başvurmak için hangi 'ek yapılandırma' gereklidir?


526

Bazı .NET 4.0 özelliklerini kullanmak istiyorum bir proje var ama temel bir gereklilik 2.X karşı derlenen System.Data.SQLite çerçeve kullanabilirsiniz. Burada kabul edilen cevap gibi bunun mümkün olduğunu belirtiyorum ama bunu nasıl başaracağımı göremiyorum.

Sadece 2.X derlemesine başvururken 4.0 projemi çalıştırmayı denediğimde:

Karma mod montajı, çalışma zamanının 'v2.0.50727' sürümüne göre oluşturulmuştur ve ek yapılandırma bilgileri olmadan 4.0 çalışma zamanına yüklenemez.

Hangi "ek yapılandırma" gereklidir?




ÖNEMLİ: Hata, "Dosya" hata sütununda olursa SGEN, düzeltmenin sgen.exe.configyanındaki bir dosyada olması gerekir sgen.exe. Örneğin, VS 2015 için oluşturun C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Kaynak: SGEN Karışık mod montajı Minimum dosya içeriği:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Yanıtlar:


686

CLR 2.0 karma mod montajı kullanmak için , App.Config dosyanızı aşağıdakileri içerecek şekilde değiştirmeniz gerekir:

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

Anahtar useLegacyV2RuntimeActivationPolicybayrak. Bu, CLR'nin karışık mod montajınızı yüklemek için en son sürümü (4.0) kullanmasına neden olur. Bu olmadan, işe yaramaz.

Bunun yalnızca karışık mod (C ++ / CLI) derlemeleri için önemli olduğunu unutmayın. Yönetilen tüm CLR 2 derlemelerini bunu belirtmeden yükleyebilirsiniz app.config.


@Reed önerinizi denedim, ancak istisna hala ortaya çıkıyor. EXE klasörüne kopyalanan app.config dosyasını iki kez kontrol ettim ve hala çalışmıyor. Log4net kullanıldığında ortaya çıkar. Bu hata hakkında hiçbir şey bulamıyorum re: log4net burada hariç: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , ama fazla bir şey söylemiyor. Özel sorunum hakkında nasıl daha fazla bilgi edinebileceğime dair bir fikrin var mı?
Dave

@Dave: Bu, log4net'in .NET 4 yerel sürümünü kullanabileceğinizi gösterir - en iyi seçenek gibi görünüyor. Bir .NET 4 sürümü varsa, kullanın ...
Reed Copsey

@ Bir tane yok, ve ben aslında bu cevabı log4net'i kendiniz derlemek zorunda kalacağınız şeklinde yorumladım. Sanırım bunu yapabilirim, ancak önceden derlenmiş ikili dosyalarını alıp projemden referans almayı tercih ederim. Buna biraz daha bakacağım. Ancak app.config dosyasını değiştirmenin neden işe yaramadığını düşünebiliyor musunuz? Belki programname.exe.config kullanmak zorunda düşündüm, ama ben de denedim ve işe yaramadı. Sınırlı deneyimlerime göre, her iki dosya adı da aynı şeyi yapıyor.
Dave

19
Ne bana bu çizgiyi koyuyordum yardımcı NUNIT en <başlangıç useLegacyV2RuntimeActivationPolicy = "true"> <supportedRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </ başlatma>: yapılandırma dosyasında
Filip Zawada

76
Microsoft özel durum iletişim kutusunda bir düğme yapmalıdır: "Bu özel durum iletisini stackoverflow üzerinde ara"
Davi Fiamenghi

35

Bu forum .NET Framework Developer Center'da yayınlanmıştır. Biraz içgörü sağlayabilir.

(Uygulamanın yapılandırma dosyasına ekleyin.)

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

2
Bu uygulama yapılandırması NANT derlemesi için nasıl kullanılmalıdır?
sagar

14

Çerçevenin hangi sürümünü hedeflediğinize bağlı olarak, doğru dizeyi almak için buraya bakmak isteyebilirsiniz:

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

Net 4.0 istemcisinin neden tam sürümü gerektirdiğini anlamaya çalışarak saatlerce boşa harcadım. Sonunda bunu kullandım:

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

11

Ayarladıktan sonra App.config dosyasını , visual studio, App.exe.config adlı bin klasöründe bir kopya oluşturur . Dağıtım sırasında bunu uygulama dizinine kopyalayın. Kulağa bariz geliyor ama şaşırtıcı bir şekilde birçok insan bu adımı kaçırıyor. WinForms geliştiricileri dosyaları yapılandırmak için kullanılmaz :).


Başka yolu da app.config silin ve sonra Projesi'nin> Add-On'un> Yeni öğeden yeni bir tane ekleyin ve (sadece app.config adlı bir metin dosyası oluşturup aynı değildir) Genel-> Uygulama Yapılandırma Dosyası seçmektir
smirkingman

8

2.0 ve 4.0 derlemelerini birlikte kullanmak oldukça basit değildir.

App.config dosyasındaki desteklenen çerçeve bildirimlerinin SİPARİŞİ, karışık modun atılması dışında bir etkiye sahiptir. Beyan sırasını çevirirseniz karışık mod hatası alırsınız. Bu cevabın amacı budur.

Bu nedenle, hatayı bir Windows Forms uygulamasında alırsanız, çoğunlukla Windows Forms uygulamalarında deneyin.

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

Ya da proje Windows Form değilse. Bir Web projesinde bunu web.config dosyasına ekleyin.

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

7

"UseLegacyV2RuntimeActivationPolicy" öznitelik kümesi ile " başlangıç" öğesi ekleyerek sorunu çözmeyi başardı .

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

Ancak etkili olması için App.config dosyasındaki yapılandırma etiketinin ilk alt öğesi olarak yerleştirmek zorunda kaldık .

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

1
Ona ne oldu version="v2.0"?
SamB

1
Derleme numarası 2.0 için gereklidir, ancak 4.0 için gerekli değildir, bu nedenle en üst sürüm yanlıştır. Tabanı doğrudur.
ickydime

5

Yukarıdaki benim için işe yaramadı (bir web uygulaması üzerinde çalışıyorum) - ama bu işe yaramadı ...

Klasördeki sgen.exe.config dosyasını düzenleyin (önce bir tane oluşturmak zorunda kaldım); C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools (v7.0 klasöründe de bir tane var, ancak bunu değiştirmem gerekmiyor, VS2012 kullanıyorum)

XML'in içeriği şu şekilde görünmelidir (önceki yanıtlarda aynı)

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

5

Senin bir web hizmetinde çalışıyor ve v2.0 montaj tarafından yüklenen bir bağımlılık ise WcfSvcHost.exe o zaman içermelidir

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

içinde .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config dosyası

Bu şekilde, Visual Studio yükleyiciden çalışma zamanında doğru bilgileri gönderebilir.


4

Visual Studio 2015 olarak değiştirdiğimizde bu sorunla karşılaştım . Yukarıdaki cevapların hiçbiri bizim için işe yaramadı. Sonunda makinede TÜM sgen.exe yürütülebilir dosyalarına aşağıdaki yapılandırma dosyasını ekleyerek çalıştık

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

Özellikle bu konumda, .NET 4.0'ı hedeflerken bile:

C: \ Program Dosyaları (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Araçlar


daha spesifik olabilir misin Bu yapılandırma seçeneklerini varolan tüm * .config dosyalarına eklediğiniz veya sgen.exe için bir .config dosyası oluşturduğunuz anlamına mı geliyor?
Adam Spicer

Benim için Visual Studio 2015 Test Projeleri ile bu sorunu yaşıyordum. Bu yazı bana yardımcı oldu. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer

1
@AdamSpicer Bunu tüm sgen.exe dosyalarının tüm .config dosyalarına ekledik. Hiçbiri yoksa, bir tane yarattık.
Çalıştır CMD

3

Bu yapılandırmayı kullandım:

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

Benim için çalıştı


3
v2.0.50727 olmalıdır, v2.0 derleme numarası için gereklidir, ancak v4.0 derleme numarası için gerekli değildir
Mart'ta

1

Visual Studio 2015'e yükseltme yaparken bu sorunla karşılaştım ve burada gönderilen çözümlerin hiçbiri herhangi bir fark yaratmadı, ancak yapılandırma değişikliği için doğru yer olmamasına rağmen. Bu yapılandırmayı ekleyerek bu sorunu giderdim:

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

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

Sonra Visual Studio yeniden başlatıldı.


0

3-4 saat çalıştıktan sonra bu konuda bir yol buldum. Aşağıdakileri ekledim

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

Bu sorununuzu çözmezse -> Right Click on DLLHata aldığınız Proje Referanslarında -> Select Properties-> Check the Run-time Version-> Eğer öyleyse v2.0.50727sorunu biliyoruz. Sorun şudur: - 2.0 Version of respective DLL. Çözüm şu şekildedir : - delete the respective DLLProje referanslarından ve daha sonra download the latest version of DLL'silgili web sitesinden ve en son sürüm DLL referansının referansını ekleyebilirsiniz.


1
DLL'nin en son sürümünün .NET'in daha yeni bir sürümüne karşı derlendiğini varsaydığınız için bu sorunu düzeltir?
Lucas

0

Aynı hatayı yaşıyordum ve sonsuza dek çözümümdeki çeşitli yapılandırma dosyalarına önerilen başlangıç ​​ifadelerini ekleyerek, çerçeve uyumsuzluğunu izole etmeye çalışarak geçirdim. Hiçbir şey işe yaramadı. Ayrıca XML şemalarıma başlangıç ​​bilgisi ekledim . Bu da yardımcı olmadı. Soruna neden olan gerçek dosyaya bakıldığında (yalnızca "taşındığı veya silindiği" söylenebilir) aslında Lisans Derleyicisi (LC) olduğunu ortaya çıkardı.

Sorun yaratan licenses.licx dosyasını silmek sorunu çözmüş görünüyor.


0

VS 2008'den VS 2010'a bazı kodları taşırken benzer bir sorunla karşı karşıya kaldım App.config dosyasında değişiklik yapmak benim için sorunu çözdü.

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

0

Bu konuma aşağıdakileri ekleyin C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 Dosya Adı: sgen.exe.config (Bu dosyayı bulamazsanız, oluşturun ve ekleyin)

 <?xml version ="1.0"?>

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

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Bunu yapmak sorunu çözdü


0

Kullanırım

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

Çalışıyor ama </configuration>etiketten hemen önce aksi halde başlangıç ​​etiketi düzgün çalışmıyor


-1

Ayrıca herhangi bir ana uygulamanıza eklenen sınıf kitaplığı ile ilgili sorun varsa, ben sınıf kütüphanesi ile bu sorunu vardı. Sadece ekle

<startup useLegacyV2RuntimeActivationPolicy="true">

daha sonra sınıf kütüphanesi tarafından seçilecek ana uygulama.


Bu eksik bir çözümdür. Konfigürasyondaki isimler büyük / küçük harfe duyarlıdır ve bir U unuttun
Chuck Dee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.