无法从Unity中的程序集FSharp.Core加载类型FSharpList

时间:2014-10-22 09:02:33

标签: .net unity3d f# functional-programming

我试图在Unity中使用F#(the game engine,而不是Microsoft dependency injection framework),到目前为止一切都很顺利 - 我可以将文件编译成DLL,将该DLL放在旁边在Assets目录中FSharp.Core.dll,Unity选择它并执行我在那里定义的任何代码。

当我尝试使用列表时,我的第一次打嗝就来了。添加以下内容:

static member template =
  [ "some strings"
    "inside an array" ]
  |> String.concat "\n"

在Unity中出现以下错误:

TypeLoadException: Could not load type 'Microsoft.FSharp.Collections.FSharpList`1' from assembly 'FSharp.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

我在Assets目录中的FSharp.Core.dll版本是与Unity打包的版本,但我尝试将其更改为其他几个版本(如可再发行版附带的那个),但无济于事。所有更改的内容都是报告的版本号:4.0.0.04.3.1.02.3.5.0

我对Unity和F#都很新,所以我可能会缺少一些基本的东西。应该在FSharpList`1程序集中定义FSharp.Core.dll吗?如果不是,在哪里?如果是这样,为什么Unity似乎无法实现呢?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我最终想到了这一点。正如CarstenKönig建议的那样,与F#/ Mono的版本有关,我正在编译以防止与Unity使用的版本兼容。由于我使用简单的fsharpc命令编译dll然后将其包含在我的Unity Assets目录中,因此我没有app.config(或者至少,如果可以使用一个我不知道如何)。

相反,我使用fsharpc的{​​{1}}选项来阻止编译器链接其默认程序集,然后手动引用Unity附带的程序集。

以下makefile将必需的DLL复制到--noframework文件夹中,并编译我们自己脚本的DLL以与Unity一起使用。它只是一次性编译,所以如果你改变任何脚本,它将重新编译所有内容,如果你使用它,你可能想要改变,但它是一个合理的起点。

Assets

我在Mac上运行,所以我的路径反映了 - 如果你在Windows上,你需要调整适合的路径。只需将.fs文件列表添加到SRC:= OUT_DIR:=../Assets/Frameworks UNITY_FRAMEWORK_DIR:=/Applications/Unity/Unity.app/Contents/Frameworks/Managed MONO_DIR:=/Applications/Unity/MonoDevelop.app/Contents/Frameworks/Mono.framework/Versions/2.10.11/lib/mono/2.0 MSCORLIB:=/Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/mono/unity/mscorlib.dll FSHARPCORELIB:=$(MONO_DIR)/FSharp.Core.dll .PHONY: all all: $(OUT_DIR)/MyScripts.dll $(OUT_DIR)/FSharp.Core.dll $(OUT_DIR)/MyScripts.dll: $(SRC) @mkdir -p $(OUT_DIR) fsharpc --noframework -r:$(MSCORLIB) -r $(FSHARPCORELIB) -r:$(UNITY_FRAMEWORK_DIR)/UnityEngine.dll --target:library -o $@ $^ $(OUT_DIR)/FSharp.Core.dll: $(FSHARPCORELIB) @mkdir -p $(OUT_DIR) cp $^ $@ ,您就可以了(我保留了本手册,因此我可以指定编译顺序)