所以我有最简单的项目。整个事情看起来像:
的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,但此刻我仍然坚持这一点。单声道页面说文件应该在库查找文件夹中链接。我确实将该文件夹添加到了所有建议的环境变量中,但这对我来说并不重要
答案 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
你会得到调试输出来解释发生了什么。