2016-04-06 32 views
3

TypeInitializationException yol açar:Ben benim test çözümü 3 projelerde var

  • f # sınıf kitaplığından
  • f # konsol uygulaması, (F # Lib Adını let) (F # Console olarak adlandırın) ve
  • C# konsol uygulaması (C# Konsolu). sınıf kütüphanesinde

Bir akka.net aktör define: Ben # konsol uygulaması f den MainClass örneğini ise

namespace Just.Test.Project 

open Akka.Actor 
open Akka.FSharp 
open Akka.Configuration 

module Actors = 

    let system = System.create "WaveNetSystem" (Configuration.defaultConfig()) 

    let simple = spawn system "simple" (fun mailbox -> 
     let rec loop() = actor { 
      let! message = mailbox.Receive() 
      printfn "%A" message 
      return! loop() 
     } 
     loop() 
    ) 

type MainClass(msg) = let x = Actors.simple <! msg 

beklediğimden olsun sonucu:

[<EntryPoint>] 
let main argv = 
    Just.Test.Project.MainClass("bugaga!") |> ignore 
    System.Threading.Thread.Sleep(1000) 
    0 // return an integer exit code 

çıkışı:

Ancak. Ben C# konsol uygulamasından aynı yaparsanız:

System.TypeInitializationException: The type initializer for '<StartupCode$SampleFSharpAkkaNet>.$Test' threw an exception. ---> System.MissingMethodException: Method not found: 'Akka.Actor.IActorRef Akka.FSharp.Spawn.spawn(Akka.Actor.IActorRefFactory, System.String, Microsoft.FSharp.Core.FSharpFunc`2<Actor`1<!!0>,Cont`2<!!0,!!1>>)'. 
    at <StartupCode$SampleFSharpAkkaNet>.$Test..cctor() 
    --- End of inner exception stack trace --- 
    at Just.Test.Project.Actors.get_simple() 
    at Just.Test.Project.MainClass..ctor() in d:\prj\research\AkkaFSharpTest\SampleFSharpAkkaNet\Test.fs:line 20 

Nasıl bu durum yorumlamak gerekir:

static void Main(string[] args) 
{ 
    new Just.Test.Project.MainClass("bugaga!"); 
    System.Threading.Thread.Sleep(1000); 
} 

istisna almak? Ne yanlış olabilir?

GÜNCELLEME Daha önce yorumlarda ve Tomas Petriček cevap belirtildiği

, konu versiyonu uyumsuzluğu ile ilgilidir. bindingRedirect iş yapıyor ve her şey çalışmaya başlıyor. Ama hala bazı yanlış anlaşılmalara sahibim. İlk önce

. Akka.FSharp referansları FSharp.Core 4.3.1.

İkincisi. F # Lib ve F # Console başvuruları FSharp.Core 4.4.0 ve C# Console, FSharp.Core için hiç bir başvuruda bulunmamaktadır.

Üçüncü. F # Konsol bir cazibe gibi çalışır ve ben yüklenen derlemeleri yazdırmak eğer olsun:

FSharpConsole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
FSharpLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

FSharp.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 

Akka, Version=1.0.6.16, Culture=neutral, PublicKeyToken=null 
Akka.FSharp, Version=1.0.6.16, Culture=neutral, PublicKeyToken=null 

FsPickler, Version=1.2.21.0, Culture=neutral, PublicKeyToken=null 
System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

yüzden hiçbir FSharp.Core 4.3.1.0 yüklendi ve her şeyin ucu-üst!

D D

Dördüncü. C# Konsolu çalışmıyor.

CSharpConsole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
FSharpLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

FSharp.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 

Akka, Version=1.0.6.16, Culture=neutral, PublicKeyToken=null 
Akka.FSharp, Version=1.0.6.16, Culture=neutral, PublicKeyToken=null 

Hem FSharp.Core, Version=4.4.0.0 ve FSharp.Core, Version=4.3.1.0 yüklenir gelir: Yüklenen meclislerinin listesi garip biraz görünüyor. Niye ya? Ve neden F # Konsol davasında değil?

ÇÖZÜM

sorun (genellikle)) kafamın içinde oldu.

Her şeyden önce, son F # Console yapılandırmasına hiç bakmadım.Gerekli buinding yönlendirir

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
</configuration> 

ama yapı sonra (AutoGenerateBindingRedirects MSBuild flag sayesinde) alır:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 

ikincisi ilk app.config oldukça basittir. "FSharp.Core Sürüm = 4.3.1.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a"

Hiçbir şekilde arasındaki çatışmayı çözmek için: C# derleyicisi derleme çıktı tür mesajları yazarak sorun hakkında bana bildir çalışıyordu ve "FSharp.Core, Sürüm = 4.3.0.0, Kültür = tarafsız, PublicKeyToken = b03f5f7f11d50a3a". "FSharp.Core, Version = 4.3.1.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a" seçimini rasgele seçerek. "FSharp.Core, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a" sürümünün "4.3.1.0" sürümünden "app.config" remapping'ini düşünün [C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ FSharp.NETFramework \ v4.0 \ 4.3.1.0 \ FSharp.Core.dll] "4.4.0.0" sürümüne [C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ FSharp.NETFramework \ v4.0 \ 4.4.0.0 \ FSharp.Core.dll ] çatışmayı çözmek ve uyarıdan kurtulmak. C: \ Program Dosyaları (x86) \ MSBuild \ 14.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1820,5): MSB3276 uyarısı: Aynı bağımlı derlemenin farklı sürümleri arasında çakışma bulundu. Lütfen proje dosyasında "AutoGenerateBindingRedirects" özelliğini true olarak ayarlayın. Daha fazla bilgi için bkz. http://go.microsoft.com/fwlink/?LinkId=294190.

Ancak C# derleyicisinin F # derleyicisi olarak biraz daha kısıtlayıcı olduğuna karar verdim. F # projelerinde bayrak otomatik olarak ayarlanmadı. Beni kontrol etmemi ne engelledi? Bilmiyorum!

+0

Farklı projelerde başvurulan bazı kitaplıkların farklı sürümleri vardır. –

+0

İstisnalar, "spawn" yönteminin C# uygulamasında tanınmadığını söylüyor. C# projenizde başvurulan Akka.FSharp ve FSharp.Core derlemeleriniz var mı? – Horusiath

+0

@horusiath Ben de düşündüm, ama hayır, burada her şey doğru görünüyor. –

cevap

3

Bu, FSharp.Core.dll sürüm uyuşmazlığı sorunu gibi görünüyor.

Büyük olasılıkla, FSharp.Core.dll'un daha yeni bir sürümünü, Akka.net için F # sarmalayıcı kitaplığı tarafından başvurulandan daha yeni bir referansa yönlendiriyorsunuz. Aynı sürümü referans alabilir veya bindingRedirect ile bir yapılandırma dosyası ekleyebilirsiniz. Bakınız Mark Seemann's blog post.

burada anahtar kelime MethodMissingException - eğer alıyorsanız o yöntemin imza sargı ile maruz sürümü eşleşmiyor FSharp.Core.dll den türleri ve (C# projesi referans temelinde) yüklendikten versiyonunu içerir çünkü (sarıcıyı derlerken kullanılan referansa göre). Sürüm uyuşmazlığı nedeniyle, türler farklı olarak ele alınır ve "yöntem bulunamadı".

+0

Haklısınız, 'bindingRedirect' çok yardımcı oluyor. Ama hala hiçbir fikrim yok, neden F # versiyonundan farklı. Gönderiyi güncelledim, lütfen bir bakabilir misiniz? –

+0

F # projesi, yapılandırma dosyasını otomatik olarak bağlayıcı yönlendirmelerle oluşturmuyor mu? Bunu yapmak için bazı MSBuild seçeneği olduğunu düşünüyorum ... –

+0

Ahhh ,,,,, Gerçekten öyle! MSBuild seçeneğinin farkında değildim ve son yapılandırmaya hiç bakmadım. Başlangıçtaki app.config dosyasında hiçbir bağlayıcı yönlendirme olmadı. –

İlgili konular