我似乎走在试错的道路上,在我之前的其他人试图创建一组新的 MonoMac 绑定。和其他人一样,我已经解决了一些问题,但最终被卡住了。
此时创建了绑定 dll,但是当它被消耗时,我在该线程的标题中得到错误。看起来关键是 EntryPointNotFoundException。如果我在 Xamarin Studio 中使用程序集浏览器,我会看到 DllImports 如下所示[DllImport(, EntryPoint = )]
:我不确定缺少的程序集名称和入口点值是否只是因为它是内部类型而浏览器不会显示这些。但这是突出的一件事......
底层库是本机 C++,我只得到了标题和静态 library.a 文件。@Stephane Delcroix 有一篇关于如何为 MonoTouch(不是 MonoMac)生成绑定的优秀文章。@poupou 有一个MonoMac 的绑定示例,但从 Objective-C 开始。我想出的生成文件如下所示:
MONOMAC=/GitHub/MonoMac/src/MonoMac.dll
MCS=mcs
SWIG=swig
XBUILD=xcodebuild
CONFIGURATION=Release
LIB=libulapi.a
WRAPPER_PROJECT=ulapi_wrapper/ulapi_wrapper.xcodeproj
WRAPPER=libulapi_wrapper.a
all: UlApi.dll
debug: CONFIGURATION = Debug
debug: all
.SUFFIXES:
.SUFFIXES: .i .h .cs .mm
%.mm: %.i headers/ulfactory.h
@mkdir -p generated
$(SWIG) -c++ -csharp -namespace UlApi -dllimport __Internal -outdir generated -o $@ $<
# Deal with reverse callbacks and fixup leading underscore on exports
ruby fixup_generated_cs.rb generated/UlApiPINVOKE.cs > generated/UlApiPINVOKE_fixed.cs
$(RM) generated/UlApiPINVOKE.cs
mv generated/UlApiPINVOKE_fixed.cs generated/UlApiPINVOKE.cs
$(WRAPPER): ulapi.mm $(WRAPPER_PROJECT)
# -sdk macosx
$(XBUILD) -project $(WRAPPER_PROJECT) -target ulapi_wrapper -arch i386 -configuration $(CONFIGURATION) clean build
-mv ulapi_wrapper/build/$(CONFIGURATION)/$(WRAPPER) $@
UlApi.dll: $(LIB) $(WRAPPER)
$(MCS) -noconfig -o- -out:$@ -res:$(LIB) -res:$(WRAPPER) generated/*.cs -target:library -unsafe -r:System -r:System.Core -r:$(MONOMAC)
clean:
$(RM) $(WRAPPER) *.dll
clean-generated:
$(RM) -r generated *.mm
clean-all: clean clean-generated
.PHONY: clean clean-all clean-generated
我和其他人了解到的一个不明显的变化是 xcodebuild 中需要“-arch i386”。在 xcode 中创建的静态库的默认值是 64 位,所以在那里也进行了更改。一旦你以 i386 为目标,你需要关闭 ARC(你实际上可以构建以 x86_64 为目标的 dll,并确保在生成的 mm 文件中 __bridge 任何(void *)NSObjects 强制转换,但听起来 i386 是从我见过......包括“ MonoMac 绑定尚未移植到 64 位”)。
我必须做的另一件事是,我的静态库包装器项目是在导出时使用前导下划线生成的(使用“ nm libulapi_wrapper.a”发现。Swig 的输出 UlApiPINVOKE.cs 文件将 EntryPoint 映射到没有有前导下划线所以我在“修复”红宝石文件中添加了更多逻辑来修补该下划线。
看起来可能与加载 dylib 的内容有关……请参见此处和此处,但不确定具体是什么。
欢迎任何建议!