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ö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!
Farklı projelerde başvurulan bazı kitaplıkların farklı sürümleri vardır. –
İ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
@horusiath Ben de düşündüm, ama hayır, burada her şey doğru görünüyor. –