Mono 跨平台编程应该注意的事项

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 目标平台上加载对应的库文件。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值