从.NET/Mono(Mac)调用目标C代码

从.NET/Mono(Mac)调用目标C代码,mono,monomac,Mono,Monomac,我正在将一个基于.NET的测试自动化框架移植到MacOSX。 我有丰富的.NET经验,但是,我在Mac世界完全是个新手 我需要从.NET/Mono调用目标C代码。我从“”教程开始 我创建了一个API定义文件。我无法编译它,因为找不到类型“BaseTypeAttribute”。后来我发现这不是问题,因为btouch工具将编译它(basetypeattribute-not-found-in-a-binding-project) 因为我是为OSX(不是iOS)开发的,所以我没有使用btouch,我打

我正在将一个基于.NET的测试自动化框架移植到MacOSX。 我有丰富的.NET经验,但是,我在Mac世界完全是个新手

我需要从.NET/Mono调用目标C代码。我从“”教程开始

  • 我创建了一个API定义文件。我无法编译它,因为找不到类型“BaseTypeAttribute”。后来我发现这不是问题,因为btouch工具将编译它(basetypeattribute-not-found-in-a-binding-project)

  • 因为我是为OSX(不是iOS)开发的,所以我没有使用btouch,我打算使用bmac工具。Findig这并不是一件小事,但我设法编译并找到了它。好

  • 我无法编译我的绑定文件,因为bmac说“类型或命名空间‘Tasks’在命名空间‘System.Threading’中不存在”。 不过,我为生成的.cs文件指定了一个输出文件夹,修复了编译错误(实际上并不需要这些任务,错误是由生成的不必要的使用导致的)

  • 因此,如果我遵循手册“绑定新的Objective-C类型/Binding_Details”文档的话,我可能已经到了这个地步

问题是我仍然不能使用我的Objective C库。 我可以使用MonoDevelop/Xamarin编译和运行C#代码,但失败的原因是:

System.Exception: Could not create an native instance of the type 'My.Type': the native class hasn't been loaded.
It is possible to ignore this condition by setting MonoMac.ObjCRuntime.Class.ThrowOnInitFailure to false.
 at MonoMac.Foundation.NSObject.InitializeObject (Boolean alloced)
 at MonoMac.Foundation.NSObject..ctor (MonoMac.Foundation.NSObjectFlag x)
 at My.Type..ctor ()
我发现一篇文章(coreplot monomac bindings崩溃)说在使用库之前必须手动加载库,但我没有运气。“Dlfcn.dlopen”始终返回IntPtr.Zero

  • 我试图在XCode中将我的库创建为“Cocoa框架”、“Cocoa库”和“Bundle”。我应该用哪一个
  • 在Mono(Mac)中是否存在任何低级调试可能性
  • 有人做到了吗?(从.net调用objc)
提前感谢,,
-g

您需要
Dlfcn.dlopen
返回有效句柄。检查是否正在将框架复制到应用程序包中,并使用正确的路径加载它。我假设这适用于库,但我只使用过Cocoa框架。最后,确保本机代码编译为32位。如果它仅为x64,它将无法工作(monomac目前仅为32位),也许这会有所帮助:@TheNextman:谢谢您的评论!有没有像Fusion Loader Log Viewer这样的工具可以告诉我库加载失败的原因?也许我把我的框架放错地方了(我试图从XCode放置构建结果的文件夹中加载它)。也许我应该把它复制到/Libraries或者别的什么地方?据我所知,没有这样的工具。在故障排除方面,请验证您是否可以首先在常规Cocoa应用程序中使用库?在加载失败的情况下,它会提供稍微好一点的信息,并让您验证库不是问题。接下来,在monomac中,您可以通过执行类似于
File.Exists(…path)
的操作来检查路径是否正确。然后,就像我说的,确保你的库被编译为32位。我肯定会尝试将你的库包含在你的应用程序包中,而不是尝试从xcode丢弃它的地方加载它