Mono System.TypeInitializationException:SwigeExceptionHelper的类型初始值设定项引发异常--->;System.EntryPointNotFoundException

Mono System.TypeInitializationException:SwigeExceptionHelper的类型初始值设定项引发异常--->;System.EntryPointNotFoundException,mono,monomac,xamarin.mac,Mono,Monomac,Xamarin.mac,我似乎走的是一条尝试和错误的道路,而我之前的其他人在尝试创建一组新的MonoMac绑定时也走过这条道路。和其他人一样,我解决了一些问题,但最终还是被卡住了 此时会创建绑定dll,但当它被使用时,我会在该线程的标题中看到错误。看起来键是EntryPointNotFoundException。如果在Xamarin Studio中使用汇编浏览器,我会看到DllImport如下所示:[DllImport(,EntryPoint=)]。我不确定缺少的程序集名称和入口点值是否只是因为它是一个内部类型,而浏览

我似乎走的是一条尝试和错误的道路,而我之前的其他人在尝试创建一组新的MonoMac绑定时也走过这条道路。和其他人一样,我解决了一些问题,但最终还是被卡住了

此时会创建绑定dll,但当它被使用时,我会在该线程的标题中看到错误。看起来键是EntryPointNotFoundException。如果在Xamarin Studio中使用汇编浏览器,我会看到DllImport如下所示:
[DllImport(,EntryPoint=)]
。我不确定缺少的程序集名称和入口点值是否只是因为它是一个内部类型,而浏览器不会显示它们。但有一件事很突出

底层库是本地C++,我只给出了标题和静态库。Stephane Delcroix对如何为MonoTouch(而不是MonoMac)生成绑定有自己的见解。@poupou有一个,但从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
MONOMAC=/GitHub/MONOMAC/src/MONOMAC.dll
MCS=MCS
SWIG=SWIG
XBUILD=xcodebuild
配置=发布
LIB=libulapi.a
WRAPPER\u PROJECT=ulapi\u WRAPPER/ulapi\u WRAPPER.xcodeproj
WRAPPER=libulapi_WRAPPER.a
全部:UlApi.dll
调试:配置=调试
调试:全部
.后缀:
.后缀:.i.h.cs.mm
%.mm:%.i头/ulfactory.h
@mkdir-p生成
$(SWIG)-c++-csharp-namespace-UlApi-dllimport\uuu Internal-outdir-generated-o$@$<
#处理反向回调并修复导出上的主要下划线
ruby fixup_generated_cs.rb generated/ulapipuinvoke.cs>generated/ulapipuinvoke_fixed.cs
$(RM)已生成/UlApiPINVOKE.cs
mv生成/UlApiPINVOKE\u fixed.cs生成/UlApiPINVOKE.cs
$(WRAPPER):ulapi.mm$(WRAPPER\u项目)
#-sdk macosx
$(XBUILD)-项目$(包装器项目)-目标ulapi_包装器-arch i386-配置$(配置)干净构建
-mv ulapi_包装器/build/$(配置)/$(包装器)$@
UlApi.dll:$(LIB)$(包装器)
$(MCS)-noconfig-o--out:$@-res:$(LIB)-res:$(包装器)生成/*.cs-target:library-unsafe-r:System-r:System.Core-r:$(MONOMAC)
清洁:
$(RM)$(包装)*.dll
清洁生产:
$(RM)-r生成的*.mm
全部清除:生成的清除清除
.PHONY:清除所有生成的干净
我和其他人学到的一个不明显的变化是Xcode构建中需要“-arch i386”。在xcode中创建的静态库的默认值为64位,因此在那里也对其进行了更改。一旦您以i386为目标,您就需要关闭ARC(您实际上可以构建以x86_64为目标的dll,并确保在生成的mm文件中桥接NSObject的任何(void*)强制转换,但听起来i386是我所看到的方式…包括“”)

我必须做的另一件事是,我的静态库包装器项目是在导出(使用“libulapi_wrapper.a”发现)上使用前导下划线生成的。来自Swig的输出UlApiPINVOKE.cs文件将入口点映射到没有前导下划线的符号。因此,我为“修复”添加了更多逻辑要在该下划线中修补的ruby文件

看起来加载dylib可能还有一些事情要做…看,但不确定到底是什么


欢迎提出任何建议!

最终解决了问题,特别感谢Xamarin支持部门的Brendan Zagaeski。Brendan撰写了解决方案的精髓。这是一个从开始到结束解释过程的地方

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

  • 在我的案例中,最大的问题是,即使包装器是在i386中构建的,源库也是为x64构建的…doh!而且此绑定的最佳源代码是通过动态库而不是静态存档
  • 不需要像iOS那样修复回调
  • 包装器库也是作为动态库创建的
  • 动态库都是从文件系统加载的(不是通过嵌入式资源)
  • 为了定位库,需要修复“安装名称”路径