System.TypeInitializationException:SWIGExceptionHelper的类型初始化程序抛出异常---> System.EntryPointNotFoundException

时间:2014-04-28 04:34:07

标签: mono monomac xamarin.mac

我似乎正走在试验和错误的道路上,我之前的其他人已经试图获得一组新的MonoMac绑定。和其他人一样,我已经解决了一些问题但最终陷入困境。

此时创建了绑定dll,但是当它被消耗时,我在该线程的标题中得到错误。看起来关键是EntryPointNotFoundException。如果我在Xamarin Studio中使用汇编浏览器,我会看到DllImports看起来像这样:[DllImport(, EntryPoint = )]。我不确定丢失的程序集名称和入口点值是否仅仅是因为它是内部类型而浏览器不会显示它们。但这有点突出......

底层库是本机C ++,我只给出了头文件和静态库.a文件。 @Stephane Delcroix有一个关于如何为MonoTouch(而不是MonoMac)生成绑定的excellent post。并且@poupou有一个binding example for MonoMac但是从Objective-C开始。我为makefile提出的内容如下:

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

我和其他人所学到的一个并不明显的变化是&#34; -arch i386&#34;在xcodebuild中需要。在xcode中创建的静态库的默认值是64位,因此也在那里进行了更改。一旦你瞄准i386,你需要关闭ARC(你可以实际构建dll,目标是x86_64,并确保在生成的mm文件中__bridge任意(void *)NSObjects的演员阵容,但听起来像i386是从我所见过的方式......包括&#34; MonoMac bindings have not been ported to 64 bits&#34;)。

我要做的另一件事是我的静态库包装器项目是在导出时使用前导下划线生成的(使用&#34; nm libulapi_wrapper.a&#34;发现。输出UlApiPINVOKE.cs来自Swig的文件将EntryPoint映射到没有前导下划线的符号。所以我在&#34; fixup&#34; ruby​​文件中添加了更多逻辑以修补该下划线。

看起来像,因为加载dylib可能还有一些事情......请参阅herehere,但不确定究竟是什么。

欢迎任何建议!

1 个答案:

答案 0 :(得分:1)

最终解决了,特别感谢Xamarin支持的Brendan Zagaeski。布兰登写下了解决方案的本质over here。这是开始完成该过程解释的地方。

解决方案中关键不明显部分的简短摘要:

  • 我的案例中最大的问题是即使包装器正在构建i386,源库也是为x64构建的...... doh!这种绑定的最佳来源是通过dylib而不是静态存档。
  • 不需要像iOS那样修复回调。
  • 包装库也创建为dylib。
  • dylib都是从文件系统加载的(不是通过嵌入式资源)。
  • 需要修复“安装名称”路径才能找到库。