CLI 语言绑定

From Apache OpenOffice Wiki
< Zh‎ | Documentation
Revision as of 03:11, 14 May 2009 by Jirong (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search




CLI(公共语言基础结构)语言绑定允许 CLI 程序连接到 办公软件,并在其上执行操作,如创建和 转换文档。CLI 程序由 IL(中间语言)代码组成,并且可以由工具(如 C# 或 VB .NET 编译器)生 成。该绑定可实现类型安全编程。所有 UNO 类型都可以用作 CLI 类型。


不完全支持 CLI 组件。也就是说,尽管可以用 CLI 语言实现 UNO 接口,但是不支持通过办公软件 的服务管理器创建实例。更确切地说,就是 无法使用 unopkg 注册组件,并且稍后也无法从运行的 程序加载这些组件。


术语

档中使用以下与 CLI 有关的缩写:

  • IL = 中间语言
  • CLI = 公共语言基础结构
  • CLR = 公共语言运行时
  • CTS = 公共类型系统


要求

语言绑定是 OpenOffice.org 2.0 的一部分,并且仅适用于 Windows 平台,如 Windows XP 和 Windows 2000。要了解语言绑定支持哪些操作系统以及必须满足的前提条件,请参阅 Microsoft .NET Framework 相关文档。必须安装 Microsoft .NET Framework Version 1.1。


OpenOffice.org 3.0 需要安装 .NET Framework 3.5。


支持的语言

一般来说,语言绑定应使所有 CLI 语言都能够与 UNO 一起使用。但是,由于缺少功能,因此并非每种语言都适用。例如,由于 UNO 使用 out 参数,因此 CLI 语言也必须支持该参数,但是在 JScript .NET 中并未给出该参数。

C# 和 VB 语言代码已经成功通过了语言绑定测试。我们发现 C++ 编译器会提供错误的 IL 代码以及枚举值数组。这样可能会引起异常,如以下示例所示:

 __value enum Colors {Red, Green, Blue}; 
 
 public __gc class Test
 {
 public:
   static void foo()
   {
       Colors ar[] = new Colors[1];
   ar[0] = Red;
   Object* o = ar->GetValue(0);
   }
 //... 
 }

当调用 ar->GetValue(0) 时,会抛出 System.ExecutionEngineException。看一下 IL,我们会发现与编译器生成的代码有两点重要区别。第一,数组 ar 被构造为数组 System.Enum 而不是 Colors。因此,ar->GetType() 将返回 System.Enum 类型而不是 Colors。第二,ar->GetValue() 被编译成 “call” 指令而不是 “callvirt”。甚至当使用 Framework SDK version 1.1 中的编译器进行编译时,该示例也会引起相同的异常。

作为一种解决方法,您可以为纯参数提供 System.Int32 数组。对于 in/out 和 out 参数则没有解决方法。此错误不会影响返回值。

另一个问题是 C++ 不支持交错数组。尽管可以创建 System.Array 数组,但它不能替代交错数组,因为它们的类型不同。因此,如果试图传送 Array 实例而不是交错数组,则编译器将生成错误。


运行于64位平台上

Sun 编译的 32位的 OpenOffice.org 3.0 同样也可以运行在64位的平台之上。 在64位平台上运行 cli 应用程序要求在该系统已安装32位的 .Net Framework(OpenOffice.org 3.0 需要安装 .NET Framework 3.5版本)。要使应用程序正常工作,它的目标编译平台必需为 x86 平台(详见 csc.exe 的平台切换)。如果使用的是 anycpu 或 x64 平台的话,应用程序将在64位进程中启动。为了连接 OpenOffice.org 并创建桥,进程必需调用 OpenOffice.org 的 DLLs,而这些 DLLs 是32位的。如果有问题将抛出 System.BadImageFormatException 异常。


可使用 .NET Framework SDK 自带的 corflags.exe 来检查程序是否被设定作为32位应用程序运行。例如:

corflags myapp.exe

能获得以下输出(不完整):

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 3
ILONLY    : 1
32BIT     : 0
Signed    : 0


如果 PE 标记的值为 PE32 时,程序也可在64位进程中运行。32BIT 标记控制为该应用程序创建的进程的类型。在64位系统上,32BIT的值对应不同的结果:

  • 32BIT = 0, 运行64位进程
  • 32BIT = 1, 强制使用32位进程


如果应用程序使用 "anycpu" 编译,那么也能在之后使用

corflags /32BIT+

改成32位标记。


这能将 32BIT 标记的值设置为 1,从而使应用程序总是由32位进程启动(即使运行在64位系统之上)。


OpenOffice.org 3.0 的更改

cli_types.dll 被 cli_oootypes.dll 和 cli_uretypes.dll 替换,并且它们都已被安装在 GAC 中。cli_uretypes.dll 包含所有 URE 中的可用类型(由 udkapi 项目定义)。cli_oootype.dll 包含所有 office 类型(由 offapi 项目定义)。


由此导致的结果是所有指向 cli_types.dll 的客户端程序将不在工作了。它们需要重新编译并指向cli_uretypes.dll and cli_oootypes.dll。


3.0 版本中包含一个 bug 使得 bridge 无法正常工作(详见: issue 95255)。此 bug 在 3.0.1 版本中被修复了。


在安装 OpenOffice.org 的时候使用 /a 开关能使调试变得方便一些,这可以防止写入注册项和在 GAC 中安装程序集(Assembly)。要使得客户端程序正常工作,必需:

  • 将 GAC 中的所有配件复制到客户端可执行文件的相同位置。它们可以在 OpenOffice.org/URE/bin 和 OpenOffice.org/Basis 3/program 目录中找到。
  • 将 UNO_PATH 设置为品牌层的程序目录,例如:C:\staroffice\Sun\staroffice 9\program
  • 在相同的控制台内运行客户端程序
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages