DLL的MonoTouch System.EntryPointNotFoundException

时间:2013-03-04 20:05:12

标签: mono xamarin.ios

我正在尝试使用我的MonoTouch应用程序访问的一些本机代码函数来创建DLL。我遵循monotouch-bindings使用的一般方法,你在:

  • 制作一个xcode项目并在其中加入一些原生代码
  • 使用xcodebuild
  • 构建静态库(.a文件)
  • 使用--link-with运行btouch以生成.dll文件
  • 在我的MonoTouch应用程序中添加对.dll文件的引用

..但每当我尝试在我的应用程序中使用这些函数时,我都会收到System.EntryPointNotFoundException。这是我正在尝试做的每件事的代码:

在.cpp文件中:

extern "C" {
   int SomeFunction();
}

int SomeFunction() {
   ...
}

用于构建.a文件的命令行

xcodebuild -project MyStaticLibrary.xcodeproj -target MyStaticLibrary -sdk iphonesimulator -configuration Release clean build

带有绑定的.cs文件(NativeBindings.cs)

public class MyStaticLibraryBindings
{
    [ DllImport( "__Internal" ) ]   public extern static int SomeFunction();
}

DLL的AssemblyInfo.cs

using System;
using MonoTouch.ObjCRuntime;

[assembly: LinkWith ("libMyStaticLibrary.a", LinkTarget.Simulator | LinkTarget.ArmV7 | LinkTarget.ArmV7s, IsCxx = true, ForceLoad = true, Frameworks = "", WeakFrameworks = "")]

构建.dll的命令行

btouch -x=NativeBindings.cs AssemblyInfo.cs --out=NativeBindings.dll --link-with=libMyStaticLibrary.a,libMyStaticLibrary.a

.. DLL构建正常,我的应用程序在编译期间看到MyStaticLibraryBindings.SomeFunction函数,但在运行时,当我调用它时,我得到System.EntryPointNotFoundException。

我已经确认libMyStaticLibrary.a 包含SomeFunction:

~/build> nm libMyStaticLibrary.a*
00000167 T _SomeFunction

2 个答案:

答案 0 :(得分:2)

此外,当您尝试P / Invoke _SomeFunction时,图书馆中的符号为SomeFunction。我遇到过一些只能使用正确的前缀

进行绑定的情况

答案 1 :(得分:1)

如果问题发生在设备上,那是因为你正在为模拟器构建本机库,而你正在为armv7,armv7s和模拟器构建dll。 您需要构建本机库3次,每次针对每个目标体系结构,将它们组合在一起:

lipo -create -output libMyStaticLibrary.a libMyStaticLibrary-armv7.a libMyStaticLibrary-armv7s.a libMyStaticLibrary-simulator.a