在Android应用中使用C# .dll库

9
我目前正在使用Monodroid开发Android应用程序。我对手机应用程序比较新,所以有一些困惑:
1. 什么是Android库的定义?我使用Mono模板创建Android库:创建一个Mono for Android类库=>编写代码并构建成.dll=>从Visual Studio在模拟器上运行,它在模拟器中正常工作。但是.dll文件是Android库吗?还是它在在模拟器上工作之前被Mono转换了,'真正的'Android库应该是JAR?
2. 我能直接使用我定义的C# .dll来制作这个应用程序吗?我尝试在Mono中通过直接引用它在我的Android应用程序中,它正在构建而且没有错误。但是当模拟器运行此应用程序时,它卡住了(仍然没有错误)-在Android应用程序项目中使用C# .dll的正确方法是什么?
我意识到有很多关于c#和android之间链接以及关于mono的主题,但是阅读之后我仍然无法解决这个库引用问题,如果有人能提供任何提示/思路,将不胜感激。
1个回答

3
  1. 生成的DLL是针对Mono for Android profile编译的,该框架基于Moonlight(Mono实现的Silverlight)。在运行时,.NET代码直接在作为应用程序一部分运行的Mono运行时中运行。当.NET代码从Java端子类化某些内容(例如Java.Lang.Object)时,Mono for Android会生成可调用包装器来处理不同运行时之间的通信。
  2. 从技术上讲,您可以在Mono for Android应用程序中使用普通的.NET DLL,但我不建议这样做。Mono for Android公开的框架比完整的.NET框架小得多(甚至不能完全等同于Silverlight),因此如果您的DLL引用了Mono for Android中不存在的方法,则应用程序将崩溃。相反,我建议为您的应用程序创建单独的类库,并使用文件链接在项目之间共享源文件。我的博客文章包含如何执行此操作的示例。

感谢您在这里的回答!因此,由于.NET代码是针对Mono运行时运行的,这是否意味着该dll只能用于Android应用程序,前提是已安装Monodroid SDK?因为我的主要目的不是应用程序,而是将一些C#库移植到Android库并将它们提供给Android开发人员..在这种情况下,这是否意味着即使我成功地使dll与Android兼容,他们仍然需要Monodroid来进行运行时包装? - lynnyilu
没错 - 使用Mono for Android编译的DLL只能用于使用Mono for Android构建的应用程序。 - Greg Shackles
如果您想向开发人员提供一个库,那么您应该为该平台编译一个dll。只要您仅使用支持的类,就可以支持多个平台。理论上,Math.Round 在所有平台上的工作方式都完全相同。这假定Mono实现与Microsoft .NET实现在所有输入方面都匹配(它很可能测试了,因为他们对此进行了单元测试)。 - Security Hound
@Ramhound,您所说的支持类是什么意思?假设我正在使用由Monodroid应用程序支持的.NET类 - 也就是说,它们提供了包装器来处理这些类,那么我是否可以编译支持多个平台的dll?因为目前我认为不可能拥有对所有Android开发人员都有价值的dll(因为他们中的大多数都使用Java编写自己的应用程序),而唯一的方法是使用Monodroid库项目将它们构建成JAR,以便Java开发人员可以使用它。您认为有没有一种方法可以使用dll完成这项工作? - lynnyilu
@LynnYiLu - 我所说的“支持的类”是Mono支持的类。你完全可以像Monodroid一样做。 - Security Hound
@GregShackles 如果我在Android原生开发中遇到了问题,并且不使用Monodroid,该怎么办?我的整个问题在这里描述,如果您有答案,请访问http://stackoverflow.com/questions/28393305/using-dll-library-in-android-application。 - Muhammed Refaat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接