将C库导入Xamarin控制台项目

时间:2015-06-10 14:22:38

标签: c xamarin mono

所以我有最简单的项目。整个事情看起来像:

enter image description here

的main.c

#include "main.h"
int testdejef(int i)
{
    return i+1;
}

main.h

#ifndef __MAIN_H__
#define __MAIN_H__

int testdejef(int i);
#endif

Program.cs的

using System;
using System.Runtime.InteropServices;


namespace TestCLib
{
    class MainClass
    {
        [DllImport("libclibjef.a",EntryPoint="testdejef")]
        private static extern int testdejef(int i);

        public static void Main (string[] args)
        {

            Console.WriteLine (testdejef (1).ToString ());
        }
    }
}

基于网络上的各种Xamarin示例,这似乎大多是正确的。但它不是,现在编译会导致" System.DllNotFoundException"。请注意,编译没有问题,调试器会这样做。

我已经读过这样的页面:http://developer.xamarin.com/guides/ios/advanced_topics/native_interop/

但是文档似乎与Android或iOS代码有关,这个问题似乎与控制台应用程序有关。任何人都知道将C库链接到项目的正确方法吗?

更新:这可能比预期更难。基于Mono documentation

  

注意:Mono使用GLib加载库,而GLib在Mac OS X上有一个错误   它不使用.dylib扩展名,而是使用Unix .so   延期。虽然这应该最终修复,但目前   解决方法是编写映射到.dylib文件的.config文件

据我所知,控制台应用程序没有app.config文件,所以我将.so编译成.dylib,但此刻我仍然坚持这一点。单声道页面说文件应该在库查找文件夹中链接。我确实将该文件夹添加到了所有建议的环境变量中,但这对我来说并不重要

1 个答案:

答案 0 :(得分:0)

这很容易,但你并没有完全正确。问题是你需要一个动态库libclibjef.dylib),并在你的DllImport属性中使用它。

目前还不清楚您是在构建动态库还是静态库(libclibjef.a - 注意扩展名),但在您的DllImport中,您引用的是静态库。

正确的DllImport属性如下所示:

[DllImport ("libclibjef.dylib")]

然后还要确保在可执行文件旁边有动态库。

如果仍有问题,可以从以下终端运行程序:

export MONO_LOG_LEVEL=debug
export MONO_LOG_MASK=dll
mono --debug yourapp.exe

你会得到调试输出来解释发生了什么。