我试图在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.0
,4.3.1.0
和2.3.5.0
。
我对Unity和F#都很新,所以我可能会缺少一些基本的东西。应该在FSharpList`1
程序集中定义FSharp.Core.dll
吗?如果不是,在哪里?如果是这样,为什么Unity似乎无法实现呢?
非常感谢任何帮助。
答案 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 $^ $@
,您就可以了(我保留了本手册,因此我可以指定编译顺序)