如何在 Xamarin 中使用 DLLIMPORT?
Posted
技术标签:
【中文标题】如何在 Xamarin 中使用 DLLIMPORT?【英文标题】:How to use DLLIMPORT in Xamarin? 【发布时间】:2019-11-26 16:43:42 【问题描述】:我在 Xamarin 中有一个用于 mac 的控制台项目,并且想使用来自外部库的 c++ 函数。但不幸的是,当我尝试像这样使用 DLLIMPORT (c#) 时:
[DllImport('path to the library')]
static extern double sum(double x, double y);
public static void Main(string[] args)
Console.WriteLine(sum(2,2));
我得到 System.DLLNotFoundException。但是它适用于系统库:
[DllImport("/usr/lib/libSystem.dylib")]
static extern IntPtr dlopen(string path, int mode);
这是我所有的代码:
1) main.cpp(来自 lib.dylib 库):
extern "C" double sum(double x, double y)
return x + y;
2) Program.cs(来自 Xamarin C# 项目):
using System;
using System.Runtime.InteropServices;
namespace Project
class MainClass
[DLLImport("/full/path/to/lib.dylib")]
static extern double sum(double x, double y);
public static void Main(string[] args)
Console.WriteLine(sum(2,2));
Console.ReadKey();
我使用 XCode 创建库 (.dylib),但不确定我是否做对了所有事情。
【问题讨论】:
docs.microsoft.com/en-us/xamarin/ios/platform/… 【参考方案1】:我想我明白出了什么问题。 我在 c# 中引用库的方式是可以的。问题是我错误地构建了库。让我解释一下。
要创建库,我使用 Mac OS 的 XCode 库项目(框架:无(普通 C/C++ 库)):
press here to view image
这意味着我在“构建设置”选项卡中的“架构”面板默认如下所示:
press here to view image
注意突出显示的属性。它们很重要。 因此,如果我保持原样并按 cmd+B(构建),我将获得一个库(.dylib 文件)。但是如果我去终端并用 lipo 检查这个库,我会得到:
lipo -info path/to/the/library.dylib
Non-fat file: path/to/the/library.dylib is architecture: x86_64
但如果我对 /usr/lib/libSystem.B.dylib 库(或任何其他系统 .dylib 库)执行相同操作,则输出会有所不同:
lipo -info /usr/lib/libSystem.B.dylib
Architectures in the fat file: /usr/lib/libSystem.B.dylib are: x86_64 i386
当我检查我自己的库时,很容易猜到我想看到同样的结果。要修复它,请返回“架构”面板并执行以下操作:
1) 检查您的“有效架构”属性。它的值必须是“i386 x86_64”(不带引号)。
2) 对于“仅构建活动架构”属性选择“否”。现在,您的“架构”面板必须如下所示:
press here to view image
3) 按下“架构”属性。选择“其他...”作为值并在打开的窗口类型中:
$ARCHS_STANDARD
x86_64
i386
press here to view image
因此,您的“架构”面板必须如下所示:
press here to view image
就是这样!现在你可以建立你的图书馆了!如果你现在用 lipo 检查它,你会得到:
lipo -info /path/to/your/library.dylib
Architectures in the fat file: /path/to/your/library.dylib are: x86_64 i386
我不确定有什么区别,但奇怪的是它解决了问题。现在我可以从 c# 调用我的 c++ 函数了。
有人知道会发生什么吗?
【讨论】:
【参考方案2】:使用 DLL 依赖项中的方法的最佳方式是将其添加到项目的依赖项中。为此,请执行以下操作:
-
右键单击要添加依赖的命名空间,然后转到添加->“引用...”;
参考管理器将打开。点击“浏览...”并找到您的 DLL 文件。
单击“确定”,您的 DLL 将作为依赖项添加到您的项目中。
要在 C# 文件中使用其方法,请在文件顶部使用“使用”语法,例如:using Xamarin.Forms.GoogleMaps.Clustering;
。之后,在 DLL 中编译的代码将可供您在文件中使用。
【讨论】:
感谢您的回答 Mateus!不幸的是,这不起作用,因为 Xamarin 不允许像这样选择我的“.dylib”库。也许有不同的方法? .dylib 代表“动态库”,与 Windows .dll 的概念相同。这个文件是你生成的吗?如果是这样,您可能可以将其重新编译为 .dll,以便将其导入 Visual Studio。 我刚看到你说你是用 XCode 编译的。如果您选择走这条路,您将需要将您的程序从 Mac 格式交叉编译为 Windows 格式。这是可能的,但应该有一个更简单的选择。我的猜测是,如果您在 Mac 上运行 Visual Studio,它只会接受“.dylib”文件,因为它在 Windows 上接受“.dll”。以上是关于如何在 Xamarin 中使用 DLLIMPORT?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin Mac,将 CGImage 转换为 .NET System.Drawing.Image