此文章由机器翻译。

"奥斯陆基础知识

生成元数据基于使用程序的奥斯陆 ” 平台的应用程序

Chris Sells

本文基于"奥斯陆平台的预发布版。如更改,恕所有信息。

本文讨论:

  • ” 奥斯陆 ” 和元数据
  • MGraph 和 MSchema
  • SQL 脚本、 打包和部署
  • Visual Studio 集成
本文涉及以下技术:
” 奥斯陆,” SQL Server 2008

内容

元数据
在"奥斯陆构建
MGraph 和 MSchema
SQL 生成
打包和部署
Visual Studio 集成
示例代码

由一组已编译的代码和一组关联的资源通常定义 应用程序基于 Microsoft.NET Framework。是例如 ASP.NET 应用程序由编译的代码 (程序集) 提供您的网站和资源文件 (.aspx 文件) 定义页本身的逻辑的定义。该代码由 CPU 执行 (后编译),并且页面解释 ASP.NET 运行库。同样,Windows Workflow Foundation (WF) 允许您为所有这些是由 WF 运行时会解释的只是数据的配置的活动的一系列定义的行为。

合并 ASP.NET UI 端和 WF 对行为上端,并且您可以开始假设构建整个应用程序,几乎完全数据,使用代码仅来填充不提供在运行库的行为。

数据驱动这些运行库有时称为元数据。元数据可以定义为描述应用程序的数据是例如如何呈现一个主页或购买的工作流的工作方式。应用程序数据表示执行的应用程序如什么 Bob 置于您的 Web 站点上其送货地址他购物车在您签出工作流的状态。

为定义元数据,以便它可以存储在一个位置提供的功能集与普通应用程序数据相同的请提供一组公共的工具,Microsoft 正在创建"奥斯陆,一个平台构建数据驱动的应用程序。 "奥斯陆"三个元素组成: 一语言统称为"M 系列,Visual 数据操作工具调用"象限式"并且数据存储区调用存储库。

此文章中, 我将向您介绍的一些"奥斯陆平台的概念。我还将向您介绍工具和技术需要使用这些概念置于操作。特别,我将讨论如何"奥斯陆"使您能够生成元数据驱动应用程序,使用在 MSchema 和 MGraph 工具和定义"M"中的类型和值,以及部署到存储库的基本知识。

Olso ”: 实现旧指出 A 新方法

数据驱动的框架为新的 Nothing。请看另一个示例: Windows Presentation Foundation (WPF)。方式编写大部分的 WPF 应用程序,应用程序的许多组成 XAML,这是在运行时加载,由 XAML 分析器解释。这是驱动器的 WPF 应用程序定义的元数据。您甚至可以通过加载,或在开发人员不了解在编译时的运行时生成 XAML 更改 WPF 应用程序的定义。

但是,没什么强大有关 XAML (编译到称为 BAML 窗体) 被绑定到您的应用程序代码的资源,它无法轻松地加载到单独的文件或甚至一个关系数据库。如果它被加载到数据库,WPF 加载程序将执行 SQL 查询而不是加载资源,Access 应用程序定义,但用户本来会不知道存在差异。如果一个应用程序定义将加载和从一个数据库的所有,未能集中,更新数据让应用程序的开发人员能够将更改传播不 re-deploying 每个客户端想要运行的应用程序。这是,实际上,killer 一项功能 Web 和一个值是否它们在浏览器中或未运行推动向所有的种类的应用程序。

现在,一旦应用程序加载到一个中心位置后,您将需要多用户功能 (如复制、 securit、 y 和版本控制。您还需要支持断开连接的用户和世界各地的不同区域设置中的用户。

最后,应用程序定义可用于不仅仅驱动应用程序的实例。可用于在开发时测试是否根据规范,应用程序的特定部分将运行。可用于在运行时显示部分在使用状况或具有疑难正在获取。可用于标记问题这样开发人员可以看到具体来说什么的导致该问题。在应用程序的元数据可以提供所有的现代索引、 优化、 复制、 安全、 版本控制、 本地化的查询功能、 脱机支持数据库。

这实质上是"奥斯陆"是所有有关使用 SQL Server 的强大功能存储应用程序的元数据。我们使用元数据到至少由于 Windows 使用的应用程序的行为的驱动器开始标记控制位将控制台窗口无需编写代码的二进制文件。 "奥斯陆"只是将形式化推广您的应用程序的元数据和提供相同的功能和用于应用程序的数据的工具。

元数据

使元数据不同于应用程序数据是应用程序很少的元数据已更改,很通常这甚至在 wildest 启动只更改一次一天,当网站的新版本被推入 Live。另一方面,应用程序通常将数据更改非常了很多,哪些用户操纵全天、 每天受欢迎的网站上的。

采用这进一步,介绍我使用的类型这篇文章在字处理器的元数据没有更改自 2007 时它已发布,但该数据已更改成千上万的只是现在我键入的字符,并移动鼠标来操作文档我所从事的时间。实际上,元数据写入这样很少,在许多情况下它只读的包像.NET 程序集或作为资源嵌入到程序集在预编译的 XAML 文件中类定义中传递。由于开发人员通常编写的元数据类似于按钮的 ASP.NET 页中定义事件处理程序根据静态性质其应用程序更改应用程序的元数据 seldomly 不坏的事情。

但是,在有关我们当前元数据基础结构类型的错误是因此不同于您将用于应用程序数据的该工具定义并读取元数据。

我可以开发应用程序可以读取和写入数据通过一个的关系数据库等查询、 保护、 复制,和版本控制的提供一套强大的工具。但如果我想查询.NET Framework 元数据,我有一组更有限的工具: 反射 API,基本上。

进一步,操作元数据的.NET Framework 工具提示使用破解的工具非常不同打开 SQL 元数据。如果希望查询应用程序的数据和元数据之间在当前正在执行与这些工作流的定义工作流的查询我已开始生成我自己的工具,因为数据源不同: 与可扩展的对象标记语言 (XOML) 文件的 SQL。

在"奥斯陆构建

可以在"奥斯陆"中生成的许多操作。 当我们在内部讨论有关方案讨论通常归结为涉及数据的构建应用程序。但是,您会注意到我列出作为"Olso"的一部分的内容的组中我没有提到任何运行库。事实上,.aspx 文件不是 ASP.NET,不太有用,并且无 WF 的 XOML 文件将得出色。

有许多的运行库并开发的服务将利用"奥斯陆"。 它们包括特定于域的语言 (DSLs) 和为 ASP.NET Web 应用程序、 WCF Web 服务和 EF 数据库的象限式设计器。您可以加载到存储库的数据,并推动这些运行库。

"奥斯陆存储库被针对企业开发人员在构建用于存储元数据自己库类似事情的应用程序。例如,"奥斯陆"将是允许查询和了解计算机的配置,轻松,或类似的操作人员的计算机配置信息的储存库、 一个存储库操作过程和脚本的一个好平台。对于开发人员,因为存储库提供一个统一和 queriable 存储元数据,就可能如回答的问题"的应用程序和类实现某些方法吗?"和"将更改此方法影响性能?"

了解分布式应用程序可能使用"奥斯陆另一个潜在区域。合并代码覆盖率,分析,将加载测试,并存储库中的体系结构数据允许开发人员能够是例如快速解决性能问题通过浏览到相关的分布式组件、 检查不同的配置参数的设置和查看相关的实现详细信息。此外,它将允许自动报表设计缺陷的静态分析工具的开发。

特别是 tickles 我要求的一个方面是部署和安装。特定于域的语言中定义安装包,并加载到存储库,开发人员将随查询工具任何现代语言的语言服务获取策略遵从性。是例如可以查询是否设置受保护与相应的许可协议。

下面是一个示例: Microsoft Download Center 网站为客户提供具有高可伸缩性的下载。承载该站点上的文件,它们必须打包 Microsoft Installer (MSI) 文件和标记的最终用户许可协议 (EULA) 中。执行操作这半了六次在 Visual Studio 中使用 GUI 后我的自动化解决方案运行查找,并找到 Windows Installer XML (WiX),它允许我使用 XML 来定义安装程序,并编译 MSI 中。

图 1 显示了 WiX XML 示例。要在 untrained 的眼睛这不似乎的改进通过运行图形的用户界面,但完成后相同 27 鼠标笔势几次,在您程序员需要通过。

图 1 WiX XML 创建 MSI 文件

<?xml version='1.0' encoding='Windows-1252'?>
<Wix xmlns="https://schemas.microsoft.com/wix/2006/wi">
  <Product Name="SuperNotepad" Id="d65d2125-560b-4ba9-bdca-3b3bcd3f7b70"
           UpgradeCode="ac5c9dac-b3f0-469a-8f1a-02c2566eee33" 
           Language="1033" Codepage="1252"
           Version="1.0.0.0" Manufacturer="SuperNotepad Corp.">
    <Package Description="A really super pad for notes" 
             Manufacturer="SuperNotepad Corp."
             InstallerVersion="200" Languages="1033" Compressed="yes" />
    <Media Id="1" Cabinet="setup.cab" EmbedCab="yes" />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder">
        <Directory Id="Directory3" Name="SuperNotepad Corp.">
          <Directory Id="INSTALLDIR" Name="Better NotePad">
            <Component Id="Component1" 
                       Guid="f7554ac8-32cd-44fb-bf85-0559c7d2e15c">
              <File Id="File1" Name="Manual.txt"
                    Source="C:\temp\SuperNotepad\Files\manual.txt" />
              <File Id="File2" Name="dependency.dll"
                    Source="C:\temp\SuperNotepad\Files\dependency.dll" />
              <File Id="File3" Name="BetterNotePad.exe"
                    Source="C:\temp\SuperNotepad\Files\notepad.exe" />
            </Component>
          </Directory>
        </Directory>
      </Directory>
    </Directory>
    <Feature Id="Feature1" Level="1">
      <ComponentRef Id="Component1" />
    </Feature>
  </Product>
</Wix>

MGraph 和 MSchema

尽管我可以自动化创建 WiX XML 以某种程度上,我确实不想编写的尖括号的海我的设置。 " 奥斯陆"允许我编写"M",一语言,包括 MSchema、 MGrammar 和 MGraph 系列中。 (在可以找到 MSchema 和 M­grammar 规范" "奥斯陆建模语言规范"和" MGrammar 语言规范"分别)

让我向 MGraph 和 MSchema (我将会在以后的文章中探讨 MGrammar) 授予进行了简要介绍。 如果您想在家中播放和,我强烈建议在 Mr。 使用"奥斯陆"Epl 工具 SDK。 ("Mr。 Epl"是如何我们 pronounce 代表 M 读评估的打印的循环的 MREPL.EXE)。 可以调用 Intellipad 附带"奥斯陆"文本编辑器中使用它从 SDK 通过从开始菜单中选择 Intellipad (示例启用) 来按 Ctrl C++/CLI 以显示该的 mini-buffer 和键入"SetMode('MScriptMode')"(没有引号,但大小写的问题),然后单击输入。

MGraph 是一种语言定义结构化数据 (更好地称为值) 的实例。 在此示例,我已定义三个数据: 匿名的整数,三个的整数的一个匿名集合,并命名为"pt1 X 和 Y,这两个整数的两个字段的记录:

42
{ 1, 2, 3 }
pt1 { X = 10, Y = 20 }

MSchema 是一语言,用于对数据中定义的约束。 MSchema 中, 一组限制被一起限制到类型。 我已在此处定义两个名为的类型、 限制为仅那些值小于 256,Integer32 类型中的内置的 SmallInteger 类型和点实体类型 (M 中的记录类型的名称) 包含两个字段 X 和 Y:

type SmallInteger : Integer32 where value < 256;
type Point { X : Integer32; Y : Integer32; };

X 和 Y 的限制保存 2,147,483,647-2,147,483,648 之间的整数值。

阅读本文的任何人都已熟悉 CLR。 CLR 使用名为"名义键入,"的内容,命名值属于单个类型。 " M,另一方面,基于结构键入,更像 XML。 在结构上键入的世界中值可以属于任意数量的类型只要数据符合由该类型设置的限制。 若要检查值是否由一个类型定义的集合中,您使用"中"运算符 (此处展示从该 Mr 内。 Epl 工具):

M>>> type SmallInteger : Integer32 where value < 256;
M>>> 4 in SmallInteger
true
M>>> 4 in Integer32
true
M>>> 256 in SmallInteger
false
M>>> 256 in Integer
true

您可以看到 4 是一个 SmallInteger 和一个 Integer32 中,,但 256 个是只有一个 Integer32。 类型成员也可以检查实体值:

M>>> type Point { X : Integer32; Y : Integer32; };
M>>> { X = 100, Y = 200 } in Point
true
M>>> pt1 { X = 10, Y = 20 }
M>>> pt1 in Point
true
M>>> pt1 in { X : SmallInteger; Y : SmallInteger; }
true
M>>> pt1 in { X; Y; }
true

您所看到的名为和未命名 X,Y 对是同时点和的两个字段在指定的 X,Y 对是 SmallInteger 值,定义匿名类型如何为您的检查此时间。 最后一行表示在名为 X,Y 对都将适合的一组具有名为 X 的字段的值和 Y,与它们的值没有限制,它们可以是字符串或日期或集合或任何。

下面是另一个示例。 在这种情况下由于在名为 X,Y 对不也 Z 字段,不适合要求 X、 Y 和 Z 的域的匿名类型:

M>>> pt1 in { X; Y; Z; }
false
M>>> pt1 in { x; y; }
false

进一步,如果最后一行,则显示 M 是区分大小写。

最后,您要了解默认值和集合表示法:

type Product {
    Name : Text;
    ...
};

type Package {
    Product : Product; // required value
    Keywords : Text*; // collection of 0 or more values
    Description : Text?; // optional value
    Comments : Text?; // optional value
    Manufacturer : Text; // required value
    InstallerVersion : Integer32 = 200; // default value
    Language : Integer32 = 1033; // default value
    Compressed : Logical = true; // defaults value
};

您看到从 WiX 模块中键入该程序包。 每个产品 (顶级概念的 MSI 安装程序中) 有一个包有一个可选文字关键字、 可选说明和注释、 所需的制造商的安装程序版本,则默认为美国默认为 Windows Installer 2.0,一种语言的集 英语和默认值为 True 的压缩标志。

所需的值具有没有后缀,产品和制造商等。 默认值含有等号和值,如 InstallerVersion 和语言。 可选的值具有如说明和注释一个问号后缀。 以星号结尾集合值 (那些具有零个或更多值)。 问题标记和 Star 理念 (? 和 *) 为了提醒您从您的收藏夹的正则表达式语言 Kleene 运算符。

下面是一个示例包值:

Products { 
    SuperNotepad : Product* {
        Name = "SuperNotepad",
        ...
    }
}

Packages : Package* where item.Product in Products {
    Package1 {
        Product = Products.SuperNotepad,
        Description = "A really super pad for notes",
        Manufacturer = Products.SuperNotepad.Manufacturer,
        Keywords = { "Installer", "Super", "Notepad", "Sample" }
    }
}

此处我已获得产品和的整个软件包的一部分。 请注意我具有两种类型的约束。 第一类是在窗体": 内容",如:

SuperNotepad : Product* {

这称为类型 ascription 和约束以符合该类型的限制到大括号内的所有值。

在第二个的限制是在 Where 子句,告知"M"编译器产品查找实体值的存储位置:

Packages : Package* where item.Product in Products {

此外请注意值的两个具有名称 (SuperNotepad 和 Package1)。 MGraph 语法用于能以便关系图的一部分可以不复制数据引用另一个部分初始化值的图形的中间的名称。 我这样,以便我可以引用该程序包的定义中我产品。

为可为 Mr。 将是 Epl,您将需要使用文本编辑器的较大的操作。 Visual Studio 2008 和 Intellipad 提供语言服务以进行编辑"M"愉快的体验。 是例如要检查您已获得语法上有效的内容,可以查找数据提示通过红色的 squiggles 显示错误 (是例如一个缺少关闭双引号)。

所有"M"代码必须是在类模块中,很多于所有基于.NET 的代码必须位于命名空间内。 此作用域类型和值。

如果缺乏 squiggles 不足以使您快乐,还可以从命令行运行"M"编译器:

C:\>set path=%path%;"c:\Program Files\Microsoft Oslo SDK 1.0\Bin"
...
C:\>m.exe /t:none wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.
C:\>

如果"M"编译器报告没有错误,您的代码是干净。请注意此处除了将具有.m 扩展名的文件传递给 m.exe,我正在还指定一个目标 (通过使用 / t 开关) 的无。这意味着仅仅执行语法检查。不使用目标开关"M"编译器将尝试使用您的程序生成 SQL 脚本创建表并插入值。

SQL 生成

如果尝试 (之后添加结束双引号) 从 WiX 模型数据示例段中生成 SQL 将错误报告如下所示:

C:\>m wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\wixbits.m(16,9): error M2010: The referenced type 'Product' does not define an identity constraint.
...

还可以获取此错误信息如果您选择 M 的模式 | 到达从 SQL 预览 Intellipad 内。 发生的情况是"M"编译器尝试生成匹配类型和值在程序中定义的 SQL 脚本。 它通过尝试将顶级命名的值 (称为范围) 来创建表语句和映射其自身的值映射到插入语句来实现。 但是,因为"M 具有各种通用数据说明使用,不中的所有内容它映射到 SQL 构造没有标识字段是例如实体类型。 就仍然有效"M,"但用于生成 SQL 的无效。

生成 SQL 是"M"编译器的默认操作,因为现代的关系数据库是一种 fabulous 环境,用于存储和操作数据。 它具有所有类型的奇妙功能,如审核,复制,版本控制,安全,和在和上。 如果要托管您的数据使用 SQL Server,您获得所有这些的功能以及稳定性和性能优化的主机。

若要使您的"M"类型与 SQL Server 兼容的情况下,映射需要的标识为列可以使用以下代码添加的:

type Package {
    Id : Integer32 = AutoNumber();
    ...
} where identity Id;

正如您所看到我正在创建域名为的 ID,以及使用自动编号函数设置默认值。 然后,我添加类型使用位置约束标记为标识列的 ID 字段的关键字。 使用此位置,我有足以有效的 SQL 获取该的类型,如 图 2 所示的数据。

图 2 生成"M"的 SQL

...
create table [WixBits].[Packages](
  [Id] int not null identity,
  [Comments] nvarchar(max) null,
  [Compressed] bit not null default 1,
  [Description] nvarchar(max) null,
  [InstallerVersion] int not null default 200,
  [Language] int not null default 1033,
  [Manufacturer] nvarchar(max) not null,
  [Product] int not null,
  constraint [PK_Packages] primary key clustered ([Id]),
  constraint [FK_Packages_Product_WixBits_Products] foreign key ([Product]) references [WixBits].[Products] ([Id])
);
...

create table [WixBits].[Packages_Keywords](
  [_Id] bigint not null identity,
  [Packages_Id] int not null,
  [Item] nvarchar(max) not null,
  constraint [PK_Packages_Keywords] primary key clustered ([_Id]),
  constraint [FK_Packages_Keywords_Packages_Id_WixBits_Packages] foreign key 
  ([Packages_Id]) references [WixBits].[Packages] ([Id]) on delete cascade
);
...

希望由"M"编译器生成的 SQL 匹配是您要自己编写。 模块名称将映射到 SQL 架构名称。 键入表名称的名称映射。 自动编号映射到域上的"标识",并标识约束的将映射到在字段上,主键约束。 内部的"M"类型,如 Integer32 和文本映射转相应 SQL 类型,如 int 和 nvarchar。 集合的字段) 的键入文本 * 在关键字字段) 映射到另一个表来存放在零个或多个项目在该集合,与相应的外键约束中。 图 3 说明了如何值映射。

图 3 映射 SQL"M"类型

insert into [WixBits].[Packages] ([Product], [Description], [Manufacturer])
 values (@WixBits_Products_Id0, N'A really super pad for notes', @WixBits_Products_Manufacturer0);
declare @WixBits_Packages_Id0 bigint = @@identity;

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Installer', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Super', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Notepad', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Sample', @WixBits_Packages_Id0);

打包和部署

默认输出"M"编译器的是您可能会希望推送到 SQL Server 2008 实例的 SQL。 默认的 SQL 被打包为单个的 SQL 脚本文件:

C:\>m.exe wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir wixbits.sql
...
11/22/2008  04:43 PM             2,545 wixbits.sql
...

您可以自由使用该的脚本文件来填充您的 SQL 数据库实例,但是希望,如与 sqlcmd.exe 或 SQL Server Management Studio。 但是,SQL 脚本有很多小比原始"M"源代码元数据。 如果您想要维护的元数据,并且没有值在执行此操作,如我将稍后解释可以选择"M"的映像打包格式与要 m.exe /p:image 命令行开关:

C:\>m.exe /p:image wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.
C:\>dir wixbits.mx
...
11/22/2008  04:44 PM             9,073 wixbits.mx
...

wixbits.mx 文件是一个"M"图像文件,包含生成的 SQL 以及清单和其他元数据。 因为该文件处于 OPC (开放打包约定) 格式,可以上继续.zip 文件扩展名,并像任何其他.zip 文件中打开它。 更是重要但,您可以使用.mx 文件引用和部署。

当您生成一个.NET 程序集时, 可以引用该程序集作为您的生成过程的一部分来提取公共类型和您基于.NET 的程序的静态实例。 如果您使用 C# 或 Visual Basic 编译器,从命令行,可以引用现有的.NET 程序集使用 / (引用) 开关。 同样,如果您要编译"M"程序,您可以使用"M"编译器在其他类型从"M"映像提取上的 / 开关。 为此,必须先导出您的类型或扩展盘区从您要引用的模块:

// WixbitsTypes.m 
module WixBits {
    export Product, Package; // export types
    export Products, Packages; // export extents

    type Product {...};
    type Package {...};
    Products : Product*;
    Packages : Package* where item.Product in Products;
}

即可导入类型和已导出的范围:

// WixbitsValues.m
module WixBits {
    import WixBits; // bring in exported types and extents
    ...
}

一旦您已建立与导出"M"图像文件,您可以引用的编译"M"导入程序时 (有关详细信息,请参阅 图 4 ).

图 4 的编译与导入的类型和范围

C:\>m.exe /p:image /t:Repository WixbitsTypes.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir WixbitsTypes.mx
...
11/22/2008  05:48 PM            28,332 WixbitsTypes.mx
...

C:\>m.exe /p:image /t:Repository /r:WixbitsTypes.mx WixbitsValues.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir WixbitsValues.mx
...
11/22/2008  05:50 PM             5,606 WixbitsValues.mx

除了打包类型和其他"M"的程序中引用的"M"图像文件可以部署到以下列方式使用"M"的加载程序实用工具 mx.exe,SQL Server 数据库实例:

C:\>mx.exe /db:Repository /i:WixbitsTypes.mx /i:WixbitsValues.mx
Microsoft (R) "Codename M" Command-line Utility version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

此处我指定的数据库连接,使用 db 开关为在数据库服务器假定本地主机和安装两个图像文件。 我加载表到 SQL 并填充给定的值这意味着我可以的使用数据访问技术,接收这些我选择的反向切换出 (或更新或删除它们或插入新记录)。 在这种情况下我正在使用 sqlcmd 命令行工具:

C:\>sqlcmd -d Repository
1> select Name from WixBitx.Products
2> go
Name
----------------
SuperNotepad
(1 rows affected)

尽管 Intellipad 支持出的包括生成 SQL,在框的"M"语言服务没有生成图像,或引用其他图像支持的机制。但是,Visual Studio 支持这些功能。

Visual Studio 集成

"奥斯陆 SDK 随 Visual Studio 2008 SP 1 的内置支持。安装 SDK 后,您将需要安装, 图 5 所示的"M"项目模板。

默认,您将获得 Model1.m 文件添加到您的项目。这将提供相同的 IntelliSense 功能,您获得 Intellipad 中。如果需要更多的模型文件,您可以右键单击解决方案资源管理器中将项目添加新的项,然后选择"M"模型模板。

图 5 Visual Studio 2008 中的 “M” 项目模板

进一步,如果您想要引用现有的"M"图像,您可以这样通过右键单击项目并选择添加引用,然后选择.mx 文件。是例如如果您想创建一个项目生成我已经被播放使用的值,和引用的类型我已经被演示的它实际显示效果 图 6

图 6 源代码和.mx 文件引用一个 “M” 项目

当您生成时,您将看到错误列表中的错误,您所料以及输出将转到 \ bin\Debug 或 \bin\Release (具体取决于正在生成的配置),包括.sql 和.mx 文件要进行的因为认为合适 (如输出.mx 文件的运行 mx.exe)。所有这些相同的操作也可以在将最新 CTP 的 Visual Studio 2010。

Visual Studio 在生成过程驱动由.mproj 扩展名为 MSBuild 文件 (请参见 图 7 )。这非常方便,如果您想要使用您自己的项目文件中的"奥斯陆 msbuild 目标文件。

图 7 MSBuild 文件"M"项目的

<?xml version="1.0" encoding="utf-8"?>
<Project ...>
  <PropertyGroup>
    <MTarget>Repository</MTarget>
    <MPackageScript>true</MPackageScript>
    <MPackageImage>true</MPackageImage>
    <MTargetsPath Condition="$(MTargetsPath) == ''">
      $(MSBuildExtensionsPath)\Microsoft\M\v1.0</MTargetsPath>
    ...
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="MixbitsValues.m" />
  </ItemGroup>
  <ItemGroup>
    <MReference Include="C:\WixbitsTypes.mx" />
  </ItemGroup>
  <Import Project="$(MTargetsPath)\MProject.targets" />
</Project>

示例代码

示例代码包含本文是一个玩具储存库安装程序实用工具 (repinst.exe),了解稍微全功能模型来描述我已经被此处讨论的 MSI 文件。一旦类型和描述 WiX 模型的值已编译 (使用 m.exe) 和加载到存储库 (使用 mx.exe) 对值数据运行 repinst.exe 实用程序将从存储库中读取数据、 从中,创建 MSI 文件并启动允许具有访问权限数据库以部署因此加载,如 图 8 中所示的应用程序的任何人都在设置。

图 8 </a0>-repinst 操作中的示例

我进行了一些工作,在此示例,主要为 exposition,重新排列,但大部分工作 (和在贷方 !) 转到 Thomas Delrue、 Alejandro Trigo 和 Giovanni Della-Libera 其用于建模 WiX,到 WiX,转换"M",并生成 MSI 从 SQL 数据上。我可以永远不会有编写这篇文章在我做不完全重要工作时间。此外,由于到 Josh Williams、 Martin Gudgin 和 John Doty 整个其他的示例生成探索会看到存储库的功能,"奥斯陆"开发人员中心实际很快现在。

Chris 销售 是连接系统部,在 Microsoft 一个项目经理,他正在开发下一第代应用程序开发技术。有关 Chris 和他的更多信息各个项目可查看sellsbrothers.com.