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

简介: 1)文件系统   在不同的平台上文件系统是不同的。包括性能等等,最简单的例子就是 Java 除开 IO 包之外还添加 NIO 包。

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

目录
相关文章
|
16天前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架
|
4月前
|
Rust JavaScript 前端开发
【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
724 0
|
2月前
|
算法 编译器 测试技术
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
85 5
|
12月前
|
安全 Go Python
GO语言开发GUI安全工具实践(一)
GO语言开发GUI安全工具实践
|
12月前
|
安全 前端开发 Go
GO语言开发GUI安全工具实践(二)
GO语言开发GUI安全工具实践
|
Rust 前端开发 JavaScript
【Rust 实战】Rust GUI 框架—抖音短视频解析工具GUI
【Rust 实战】Rust GUI 框架—抖音短视频解析工具GUI
2528 0
【Rust 实战】Rust GUI 框架—抖音短视频解析工具GUI
|
前端开发 JavaScript
开源项目推荐:Electron,使用网页编程的方式构建跨平台的桌面应用
开源项目推荐:Electron,使用网页编程的方式构建跨平台的桌面应用
658 0
|
Java 关系型数据库 程序员
一起谈.NET技术,分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发
  在许多年前,“语言”就等同于“平台”,例如C,C++以及最早的Ruby和Python等等。但是随着技术发展,出现了一些通用的平台,例如.NET和Java,逐渐这些平台上的语言也越来越多。再后来,某些语言在不同平台上的实现也越来越多,事情也变得有些复杂。
1451 0
|
C#
C#使用Xamarin开发可移植移动应用进阶篇(9.混淆代码,防止反编译)
原文:C#使用Xamarin开发可移植移动应用进阶篇(9.混淆代码,防止反编译) 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.
1431 0