概述
1)文件系统
在不同的平台上文件系统是不同的。包括性能等等,最简单的例子就是 Java 除开 IO 包之外还添加 NIO 包。因为在 Unix
系统上使用 块方式(NIO) 读写比 用流(IO)的方式性能要好的多. 当然 Mono 也考虑到这个问题所以才会有 Mono.Unix 名称空间的
存在.当然最显而易见的是在不同的平台上文件分割符的不同. Windows 上使用 "/",Linux/Unix 上使用 "/". 为了使程序能适应
不同的文件系统,可以使用 System.IO.Path.DirectorySeparatorChar 来获取当前系统的文件分割符.但是更好的办法是用
System.IO.Path.Combine 方法来完成:
string directory = "tmp";
string filename = "myfile";
// WRONG
string wrongpath = directory + "/" + filename;
// RIGHT!
string rightpath = System.IO.Path.Combine (directory, filename);
获得系统临时目录,Windows 下在 %WindowsPath%/temp ; Linux/Unix 在 /tmp 下。所以可以使用 GetTempFileName() 来获取
系统的临时目录,方便我们的程序存贮临时数据。Mono小组已经将该方法为适应多平台而重写。重写的方法还有很多比如:
GetPathRoot()、GetFileName() .......
Linux/Unix 在文件系统布局上也有特别之处,它们只有一个逻辑分区那就是 root 根目录 (即 "/").而Windows 通常包含不只一个
逻辑分区( D:/、E:/、F:/ ).当需要用户要针对逻辑分区操作的使用可以使用 System.IO.Directory.GetLogicalDrives() 来获取
当前系统所有的逻辑分区.
using System;
using System.IO;
public class Demo {
public static void Main (string [ ] args)
{
foreach (string dir in Directory.GetLogicalDrives ( )){
Console.WriteLine ("{0}", dir);
}
}
}
最后提醒在 Linux/Unix 平台上是区别字符大小写的,而 Windows 则不区别。所以 README 与 ReadMe 在 Linux/Unix上是被认为
2个不同的文件, Windows 则认为是同一个文件。
2) Graphical user interfaces (用户图形接口)
Mono提供 System.Windows.Forms 类似 Windows 的用户图形接口,也提供了 Gtk# 类似 Linux or Solaris 的图形接口
。它们都包含了 menu titles, dialog button order, drag and drop 等等。
当你在开发跨平台应用程序的时候,将会在 System.Windows.Forms (SWF) 与 Gtk# 之间做出选择。 Mono SWF 是对 Microsoft's
.NET framework 中的 SWF 的移植,事实上它并不等同与 MS SWF ,因为MS SWF 有太多的代码是依赖原 COM 接口。MONO
小组已经将 Mono SWF 重新实现其原理和 Java 的 Swt 组件基本类似.而且 Mono SWF 并不是完整的跨平台,它只能够移植基于 X86
的Linux 平台 (只有 Linux).真正完整实现跨平台的只有 Gtk#. 所以 Mono小组 推荐开发者使用 Gtk# 作为应用程序的首选图形接口。
3) Configuration (配置)
相当一部分 Windows .Net Application 会使用注册表来存贮它们的配置信息。而一部分 Linux/Unix Mono Application 会使用
GConf 来存贮它们的配置信息。这样做都将不利于程序的跨平台。最好的办法是使用 XML 结构的文件来保存配置信息。
4)P/Invoke
针对 Net assembly 来说只要将其加载至 GAC 里面。Mono/MS .Net 都将可以成功使用.
针对不同系统不同语言的库文件来讲,应该知道同一个文件在不同系统的名称。然后为自己的应用程序配置一份 .Config文件
在文件中配置:
<configuration>
<dllmap dll="libglib-2.0-0.dll" target="libglib-2.0.so.0"/>
<dllmap dll="libgobject-2.0-0.dll" target="libgobject-2.0.so.0"/>
<dllmap dll="libatk-1.0-0.dll" target="libatk-1.0.so.0"/>
<dllmap dll="libgtk-win32-2.0-0.dll" target="libgtk-x11-2.0.so.0"/>
</configuration>
只有这样 DllImport function 才会正确的在 target 目标平台上加载对应的库文件。
最后
以上就是独特白猫为你收集整理的Mono 跨平台编程应该注意的事项的全部内容,希望文章能够帮你解决Mono 跨平台编程应该注意的事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复