65.9K
CodeProject 正在变化。 阅读更多。
Home

IMSL® C# 与 Excel 和 VSTO:简介和演练

2008年1月7日

CPOL

25分钟阅读

viewsIcon

52940

本文档重点介绍 VSTO 2005 和 Visual Studio 2005 Team Edition 的结合使用。

这是我们对 The Code Project 赞助商的展示性评测。这些评测旨在为您提供我们认为对开发人员有用且有价值的产品和服务信息。

IMSL® C# 库可节省开发时间。欲了解更多信息或申请免费评估,请点击此处!您也可以预订 20% 的折扣,稍后购买!

目录

引言

微软首次发布了用于 Office 2003 产品系列和 .NET Framework 1.1 版的 Visual Studio Tools for Office (VSTO)。该概念允许 .NET 开发人员使用 Office 套件作为开发平台,创建结合 Microsoft Office 和 .NET 功能的应用程序。然而,使用并不直接,部署也非常困难,这主要是由于对 .NET 安全设置的误解。

2005 年 11 月,微软发布了 .NET Framework 2.0 版和各种更新工具。其中一个工具是 Microsoft Visual Studio 2005,它有多个版本,包括 Team Studio Edition。VSTO 的更新版本 VSTO 2005 旨在克服用户在使用第一个版本时面临的许多挑战,并包含在 Visual Studio 2005 的 Team Studio Edition 中。

本文档重点介绍 VSTO 2005 和 Visual Studio 2005 Team Edition 的结合使用。2006 年 11 月,随着 Microsoft Office 2007 产品套件的发布,新版 Visual Studio Tools for Office,即 VSTO 2005 SE(第二版)也发布了。由于 Excel 2003 的广泛采用,本文以其作为目标环境;然而,Excel 2007 也能够运行本文开发的示例项目。据传,下一版 Visual Studio(代号 Orcas)将在专业版中包含 VSTO 工具,并且不需要升级到 Team Edition 之一。此更新将包含更多功能以利用 Office 2007 界面元素。

配置

结合 .NET Framework 开发 Excel 应用程序的核心组件是 Visual Studio 2005 Team Studio Edition。其他版本的 Visual Studio 2005 不包含 Visual Studio 2005 Tools for Office。安装 Team Studio Edition 时,请务必进行完整安装或选中 VSTO 组件的复选框。

本示例适用于 Office 2003 的组件 Excel 2003,并且必须安装 Office 2003 Service Pack 1 才能支持 VSTO。此外,还必须安装 Visual Studio 2005 Tools for Office Runtime (VSTOR.exe)。如果所有组件未正确安装,当您首次尝试创建 Office 项目时,可能会收到以下错误消息

如果遇到错误消息,请按照链接和说明安装所有必需的组件和更新。

Visual Studio 还提供了安装对多种不同语言支持的选项。我们将调用 IMSL C# 数值库,但作为具有语言独立元数据的 .NET 程序集,它可以同样轻松地从 VB.NET、C++ 或 J# 中使用。在编写 Office 应用程序时,Visual Basic 更易于使用,因为它简化了 Office 对象模型的调用;因此,本示例使用此语言。当然也可以使用 C# 或其他 .NET 语言创建这些示例,但缺乏文档和复杂的方法签名会带来挑战。要按照所写的示例进行操作,您需要安装 VB.NET 支持。

加载项

所有示例都使用 Excel 工作簿模板从 Excel 工作簿内部调用 IMSL C# 数值库。还有其他几种方法可以将 Excel 与外部托管 .NET 库集成,包括创建加载项。概念上的区别在于,此处描述的工作簿模型被称为“文档级项目”,而加载项是“应用程序级项目”。

在文档级别,所有自定义都特定于单个工作簿中的一个或多个工作表,但在应用程序级别,自定义 Excel 函数将可用于所有工作簿。最终结果可能包含本文讨论的相同类型的功能,但界面和开发是主题的变体。有关应用程序级加载项的更多信息,请参阅大量的在线文档

创建项目

要创建新项目,第一步是打开 Visual Studio 2005 中的对话框。对于本示例,我们要为 Excel 工作簿创建一个新的 Visual Basic 项目。有几种方法可以实现这一点,包括从打开的摘要页面中选择“创建项目…”或从“文件”菜单中选择“新建项目…”选项。在本示例中使用的系统上,用户配置为 C# 开发人员,因此默认项目选择是 Visual C#。要创建 Visual Basic .NET 项目,我们必须浏览“其他语言”下的 Visual Basic 模板,然后单击“Office”部分以找到几个可用的模板。我们希望允许 Excel 工作簿上下文中的用户使用 IMSL 功能,这可以通过创建 Excel 工作簿项目来实现,因此选择该模板,如以下屏幕截图所示

vni_screenshot2.jpg

将新项目命名为 ExcelWorkbookIMSL,然后单击“确定”以进入新项目向导的下一步。对于将来的项目,您可能已经创建了一个现有工作簿;但是,这里我们将从一个全新的工作簿开始,如下图所示

vni_screenshot3.jpg

在此阶段,您应该会看到一个空的 Excel 工作簿;它通常包含三个空白工作表。在“解决方案资源管理器”中,您会找到每个工作表和整个工作簿的“代码隐藏”Visual Basic (*.vb) 文件。此时,所有这些由模板创建的空源文件都存在于解决方案中,但除了空的 Startup 和 Shutdown 方法外,它们都是空白的。以下是空白工作簿和源代码文件的图像

vni_screenshot4a.jpg vni_screenshot4b.jpg

添加引用

项目创建后,我们需要添加对 IMSL C# 数值库程序集的引用。在典型的 Visual Studio 项目中,“解决方案资源管理器”包含一个“引用”标题,可以右键单击以添加对其他项目或程序集的引用。对于此 Excel 工作簿项目,您需要右键单击项目标题本身以显示“添加引用…”对话框,如以下屏幕截图所示

vni_screenshot5.jpg

出现的下一个对话框允许您浏览到 IMSL C# 程序集 imslcs.dll;默认安装目录是 C:\Program Files\VNI\IMSLCS4.0.2\bin。添加后,我们可以通过打开其中一个 Visual Basic 源文件(例如,通过右键单击“解决方案资源管理器”中的 Sheet1.vb 并选择“查看代码”)并添加一个 imports 行来确认该库可用。如果 IMSL 库已成功添加为引用,则代码完成(如以下图像所示)应该处于活动状态。

vni_screenshot6.jpg

此 Imports 确认很有价值,但在示例中未使用。所有示例都使用完整的类名(包括命名空间)来创建包含的代码片段。作为外部 .NET 引用,imslcs.dll 程序集的副本应与电子表格对象一起位于 bin\Debugbin\Release 目录中。如果 imslcs.dll 已添加到全局程序集缓存中,则项目中可能不存在本地副本,但在将应用程序部署到其他计算机时需要一个副本。有关部署的更多信息,请参阅本文档的部署部分。有了空白项目和可用的 IMSL C# 数值库,我们就可以开始构建示例了。

示例

本文档中的示例按复杂度递增的顺序列出。每个示例都用 Visual Basic 编写,尽管如前所述,也可以用 C# 或其他 .NET 语言创建它们。整个过程中使用一个项目,根据需要添加其他组件和代码隐藏方法,但它们是独立的,后面的示例不依赖于前面示例中的代码。

简单示例

使用 IMSL C# 数值库最简单的方法之一是最大限度地减少与电子表格对象的交互并硬编码变量。首先,我们需要为用户提供一个启动操作的方法。有多种方法可以允许用户与工作表进行交互,但为了避免额外的复杂性,这些示例中使用了按钮控件。

要查看电子表格并打开 Visual Studio 工具箱,请选择 ExcelWorkbookIMSL.xls 选项卡。如果工具箱不可见,您可以从左边缘(通常)拖动它打开,或者按 Ctrl-Alt-x 打开窗口。选择“按钮”控件并将其拖入电子表格以创建它。创建后,它被称为 Button1,并以此名称作为其文本属性。为了更具描述性,在选中按钮的情况下,向下滚动右下角的“属性”视图,并通过“文本”属性字段将其名称更改为 Erf(0.2)。这个名称稍后会更有意义。有关 Visual Studio 2005 中的当前状态,请参见下图

vni_screenshot7.jpg

接下来,我们可以让 Visual Studio 生成一些代码,以便我们在用户单击按钮时填充空白并执行某些操作。双击按钮,视图将更改为 Sheet1.vb 的代码隐藏,其中有一个空白的 Button1_Click 方法。这是用户在运行时单击按钮时执行的方法。对于本示例,我们返回在 0.2 处评估的误差函数的值。填写此方法,使其内容如下

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
    Dim result As Double
    result = Imsl.Math.Sfun.Erf(0.2)
    Me.Application.ActiveCell.Value = result
End Sub

具体来说,这段代码创建了一个名为 result 的 Double 变量,然后调用 Imsl.Math 命名空间中 Sfun 类的共享(静态)方法 Erf。然后将输出存储在活动单元格中。要测试此代码,可以使用“不调试启动”命令自动生成解决方案并启动 Excel。您可以通过按 Ctrl+F5 或在菜单栏的“调试”菜单项下选择“不调试启动”选项来执行此操作。然后您应该会看到 Excel 和您的新按钮。单击按钮以查看结果填充在活动单元格中。屏幕截图如下

vni_screenshot8.jpg

本示例展示了将 IMSL C# 库功能嵌入 Excel 工作表的一种直接方法。按钮交互背后的代码可能要复杂得多,可以使用 .NET Framework 中几乎所有可用的功能,包括基类库或像 IMSL C# 数值库这样的外部程序集。与电子表格对象的交互仅限于将标量输出值写入活动单元格,但以下示例将扩展该交互以及来回传递的数据类型。

标量输入和输出

下一个练习将上一个示例提升到新的水平。Erf 方法的输入参数从电子表格中检索,输出返回到特定单元格。与工作表中特定单元格的交互是通过命名范围实现的。命名范围的优点是,单元格对用户而言与任何其他单元格一样,但在代码隐藏中开发人员可以通过名称访问它们。基于我们已经创建的相同项目,选择单元格 A4 并右键单击。选择“管理命名范围…”选项以调出对话框。当前范围列在底部的“引用”框中,而顶部的框等待您输入名称。输入 ErfInput,然后选择“添加”,再单击“确定”。对 B4 重复此过程,将其命名为 ErfOutput,如以下屏幕截图所示

vni_screenshot9.jpg

以下图片中,这些单元格用颜色表示,以区别于工作表中的其他单元格。当然,这种着色是可选的,但在较大的工作簿应用程序中,重要单元格通常会以某种方式突出显示或标记。

为了允许用户交互,在这两个单元格下方添加了另一个按钮控件,并将其命名为 Compute Erf()。此按钮的创建和编辑与之前相同。再次双击该按钮会弹出此按钮动作的空回调方法。用以下代码填充该方法

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
    Dim result As Double
    Dim input As Double
    input = ErfInput.Value
    result = Imsl.Math.Sfun.Erf(input)
    ErfOutput.Value = result
End Sub

...名为 ErfInput 的范围。当您输入上述代码时,代码完成会显示该对象可用的许多属性和方法,因为它实现了 Range 接口。在这种情况下,我们只需要检索其 Value 属性。该值被视为 Double 类型,但实际上它作为 Object 类型返回。返回 Object 是一种通用实现,因为单元格可能包含从文本到公式的任何内容。您应该在已部署的应用程序中包含错误检查,因为如果尝试将文本转换为 Double 类型,则会引发异常,如下所示

vni_screenshot10.jpg

这里我们在 ErfInput 范围中输入了文本“a”,它不能转换为 Double 类型。虽然异常的详细信息部分足够描述性,但更简洁的方法是在代码中捕获此转换错误,然后以 MessageBox 等方式清晰地报告问题。

继续,假设输入变量现在是一个有效的 Double 值,则调用 Erf 方法,并通过设置 ErfOutput 命名范围的 Value 属性来返回结果。成功运行如下所示

vni_screenshot11.jpg

通过这个例子,我们允许电子表格的用户在单元格 A4 中输入一个值,并评估误差函数的值,然后通过点击按钮将结果返回到单元格 B5。本例中,单个值作为静态方法的输入。下一个例子将扩展为接受数组作为 IMSL C# 库类的输入。

数组输入

本示例通过接受数组作为输入,将复杂性再提高一个档次。此外,数组可以是任意长度,因为大小是在命名范围中检索的,而值位于该单元格下方。使用的 IMSL 库函数是 SignTest 类。前面的示例使用了 Sfun 类中的 Shared(静态)方法,但 SignTest 需要构造函数和后续方法调用。但是,代码隐藏支持这种更复杂的对象结构,并且不限于静态方法调用,甚至不限于一次使用一个类或引用库。

继续使用 ExcelWorkbookIMSL.xls 电子表格,按照上述说明创建命名范围,将单元格 A8 命名为 SignTestCount,将单元格 B8 命名为 SignTestOutput。A8 下方 A 列中的单元格用作输入。为了灵活性,在单元格 A8 中输入公式 =COUNT(A9:A1000),以便我们可以输入近一千个值。在此示例中,我们只使用少量值,但这是一个通用公式的示例,可以使用。单元格 A9 到 A27 填充了 IMSL C# 数值库文档中 SignTest 示例的值,如屏幕截图所示。创建另一个按钮控件,命名为“Sign Test”,其 Click 方法包含以下代码

Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click
    Dim count As Integer
    Dim i As Integer
    Dim result As Double
    Dim st As Imsl.Stat.SignTest
    count = SignTestCount.Value
    Dim x(count) As Double
    Dim values(count, 1) As Object

    Dim inputRange As Excel.Range
    inputRange = Me.Range(SignTestCount.Offset(1, 0), _
    SignTestCount.Offset(count, 0))
    values = inputRange.Value( _
    Excel.XlRangeValueDataType.xlRangeValueDefault)
    For i = 1 To count
    x(i) = values(i, 1)
    Next
    st = New Imsl.Stat.SignTest(x)
    result = st.Compute()
    SignTestOutput.Value = result
End Sub

这是迄今为止最复杂的代码,但其中大部分与之前的示例非常相似,其余部分则包含了从单元格范围检索数组的说明。第一部分声明了正在使用的变量,包括 SignTest 类实例 st。请注意,单元格数量 count 是从命名范围 SignTestCount.Value 中收集的,并且此变量用于声明 x 数组的大小。

然后我们定义一个新的 Range 对象,并使用 Offset 方法定义其相对于 SignTestCount 单元格的端点,预期输入值将直接列在该单元格下方。为了正确检索此范围的内容,values 变量被声明为二维 Object 数组,并且其 Value 属性传递了可选参数 XlRangeValueDataType.xlRangeValueDefault。有关更多详细信息,请参阅 MSDN 文档中的 NamedRange.Value

通过此调用,我们能够将 Object 类型的 values 数组解析为 Double 类型的值,并填充 x 数组。values 数组不能直接传递给 SignTest 对象,因为构造函数需要一个一维 Double 数组。一旦我们循环遍历数组以填充 xSignTest 对象就会实例化并调用其 Compute 方法。结果将返回到 SignTestOutput 命名范围。运行此示例的结果如下所示(出于格式原因,列已分成两半)

vni_screenshot12.jpg

数组输入和输出

在本示例中,我们演示了矩阵乘法,这在电子表格中通常不进行,但在数值分析的许多领域中却经常使用。IMSL C# 库中的重载 Matrix.Multiply 静态方法接受一维和二维 Double 值数组,并返回一个大小合适的 Double 数组,其中包含矩阵-矩阵、向量-矩阵或矩阵-向量组合的乘积。再次使用命名范围来定义输入变量,但它们的大小是在运行时确定的,而不是像之前的 SignTest 示例那样需要一个计数单元格。将单元格范围定义为命名范围的方式与单个单元格相同:突出显示区域并右键单击,从列表中选择“管理命名范围…”

由于输出范围取决于输入矩阵的大小,我们使用活动单元格作为输出左上角的位置。按钮回调方法中的代码如下

Private Sub Button4_Click(yVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click
    Dim objectMatrixA(,) As Object = MatrixA.Value
    Dim objectMatrixB(,) As Object = MatrixB.Value
    Dim colA As Integer = objectMatrixA.GetLength(0)
    Dim rowA As Integer = objectMatrixA.GetLength(1)
    Dim colB As Integer = objectMatrixB.GetLength(0)
    Dim rowB As Integer = objectMatrixB.GetLength(1)
    Dim localMatrixA(colA - 1, rowA - 1) As Double
    Dim localMatrixB(colB - 1, rowB - 1) As Double
    Dim Result(,) As Double
    Dim i, j As Integer

    ' convert Object(,) arrays to Double(,) arrays
    For  i = 1 To colA
        For j = 1 To rowA
            LocalMatrixA(i - 1, j - 1) = objectMatrixA(i, j)
        Next
    Next
    For i = 1 To colB
        For j = 1 To rowB
            localMatrixB(i - 1, j - 1) = objectMatrixB(i, j)
        Next
    Next

    Result = Imsl.Math.Matrix.Multiply(localMatrixA, localMatrixB)
    Dim outputRange As Excel.Range
    outputRange = Me.Range(Application.ActiveCell, _
        Application.ActiveCell.Offset(colA - 1, rowB - 1))
    outputRange.Value = Result
End Sub

这段代码与之前的示例有许多不同之处,揭示了在这个级别上与 Excel 电子表格单元格交互的多种方式。首先,MatrixAMatrixB 命名范围的值通过调用它们的 Value 属性来检索,并存储在 Object(,) 数组中。localMatrix_ arrays 声明为 Double 类型,其大小由它们的对应物决定。请注意,出现了许多 -1 偏移量,以解释处理数组索引的差异。一旦循环填充了 Double 数组,就会调用 Matrix.Multiply 方法,并将结果存储在 Result 中。我们定义了一个新的 RangeoutputRange,其大小由 A 的列数乘以 B 的行数(根据矩阵乘法规则)定义。通过将此范围的 Value 属性设置为 Result,可以将输出写入工作表中的活动单元格。

以下是示例的屏幕截图。输入范围 MatrixA 呈橙色;MatrixB 呈黄色。请注意,即使第二个矩阵和输出范围是一维的,使用二维数组的通用代码也能正常工作。活动单元格在第一张图像中突出显示,并在单击 MatMul 按钮后填充

vni_screenshot13.jpg

此示例适用于任何大小的输入矩阵。此外,二维数据集的输入和输出在矩阵运算之外还有许多应用。IMSL 库中有许多函数依赖于此类数据。

图表可视化

虽然 Microsoft Excel 提供了各种图表功能以及易于使用的图表创建界面,但最终结果有时不适用于定量应用程序。在这些情况下,以编程方式创建的直接图表可能会提供更好的解决方案。IMSL C# 数值库包含具有面向对象编程接口的图表组件,这些图表可以使用与前面示例相同的编程模型添加到工作表中。

通过从工具箱窗口拖动并将 .NET 用户界面组件(如按钮控件)拖放到工作表上,可以将其添加到 Excel 工作表。要以这种方式使用 IMSL C# 库图表组件,必须首先将组件添加到 Visual Studio 工具箱。请按照以下步骤将 PanelChart 组件添加到工具箱

  • 右键单击“工具箱”并选择“选择项目…”
  • 在“.NET Framework 组件”选项卡下,单击“浏览…”
  • 找到 imslcs.dll 程序集。

或者,您可以将 DLL 拖放到工具箱上。要将 Chart 添加到工作簿,请在工具箱上找到 PanelChart 对象(它可能位于“常用控件”部分),然后单击选中它。请注意,您必须将项目置于“设计视图”中。然后将光标移动到工作表区域,并拖动以定义图表的边界。它将显示为一个空白的白色矩形区域。

在编程上,创建的 PanelChart 对象的属性可以通过 Excel 电子表格后面的代码访问,其方式与传统 .NET Windows 窗体桌面应用程序完全相同。对于此 VB.NET 示例,考虑绘制一个简单的一维数组,就像我们在 SignTest 示例中使用的那个。以下代码段将数组 x 绘制为彩色线条。

' code snippet to work with a PanelChart object
Dim chart As Imsl.Chart2D.Chart
Dim axis As Imsl.Chart2D.AxisXY
Dim data As Imsl.Chart2D.Data
chart = Imsl_Chart2D_PanelChart1.Chart
axis = New Imsl.Chart2D.AxisXY(chart)
data = New Imsl.Chart2D.Data(axis, x)
data.LineColor = Color.BlueViolet
Imsl_Chart2D_PanelChart1.Refresh()

代码的前几行定义了图表层次结构中的对象:Chart 包含 Axis 对象,Axis 对象包含 Data 对象。图表引用是从嵌入的 PanelChart 对象的 Chart 属性获取的。然后定义轴和数据对象,并且 SignTest 示例中的 x 变量出现在这里。将 Line Color 属性设置为示例,然后调用 Refresh 方法以在电子表格内重新绘制 PanelChart。最终结果的屏幕截图如下

vni_screenshot14.jpg

这是一个简单的例子,但 IMSL C# 数值库的任何图表功能都将以类似的方式访问。这些功能包括条形图、饼图、高低收盘图、等高线图、热力图和树状图等。

部署

VSTO 应用程序的部署对于 .NET Framework 1.1 版的许多开发人员来说是一个挑战,但在 2005 年更新中得到了简化。有详细的文档在线提供,但我们可以总结一下将本文中创建的项目部署到与开发机器不同的计算机所需的条件。

目标部署计算机有许多先决条件,包括 .NET Framework 2.0 和 Visual Studio Tools for Office 运行时。有关这些下载的链接,请参阅上一段中的链接。需要安装 Microsoft Excel 2003 或更高版本,以及 ExcelWorkbookIMSL.xls 电子表格、ExcelWorkbookIMSL.dll 程序集和 IMSL C# 库 imslcs.dll 程序集及其附带的许可证管理 DLL。

一旦这些组件(位于 bin\Debugbin\Release 目录中)安装到客户端计算机上并安装了 VSTO 运行时,文档和程序集就必须被授予“完全信任”。这可以通过授予单个程序集或整个文件夹信任来完成。配置权限有几种方法,但最直接的方法是使用 Microsoft .NET Framework 2.0 Configuration 图形用户界面。此工具可通过控制面板中的“管理工具”访问。有关所涉及步骤的副本,请参阅本文档的附录 A,或参阅 MSDN 上的说明。

请注意,虽然此工具包含在 .NET 1.1 运行时可再发行软件包中,但它仅包含在 .NET 2.0 SDK 中。对于开发人员来说,这是有道理的,但许多最终用户不需要安装 SDK。在没有 Configuration GUI 工具的情况下,配置安全策略的建议方法是使用代码访问安全策略工具 (caspol)。虽然不像图形版本那样易于使用,但大规模部署通常由精通 Microsoft 命令行工具的 IT 人员处理。

一旦使用这些方法之一授予相应文件夹完全信任,本地计算机上的用户就可以通过打开 ExcelWorkbookIMSL.xls 电子表格来启动 Excel。点击任何按钮(活动单元格位置适当)都应导致预期的执行。如果安全设置未正确配置,用户将收到如下错误消息

vni_screenshot15.jpg

虽然此错误也可能表示程序集未正确复制,但通常是安全设置的问题。不幸的是,显示的详细信息对普通最终用户帮助不大,因此在广泛分发 VSTO 解决方案之前,彻底测试部署非常重要。

发布向导

为了帮助您打包 VSTO 应用程序,Microsoft 还提供了使用“发布向导”的功能。通过在“解决方案资源管理器”中选择项目,右键单击,然后从菜单中选择“发布…”来启动向导。对于此示例,我们可以通过填写如下所示的 URL 来部署到本地磁盘

pubwiz.jpg

您会发现这已创建了一个 ExcelWorkbookIMSL.application 文件,并将 ExcelWorkbookIMSL.xls 文件的副本放置在指定目录中。还有一个名为 ExcelWorkbookIMSL_1.0.0.0 的子文件夹,其中包含程序集、电子表格和清单文件。虽然此向导有助于提取所需组件并创建清单,但您仍然需要在每台计算机上授予适当的权限。

其他部署资源

Microsoft 文档中还有许多其他部署 Office 解决方案的选项。各种模型超出了本文档的范围,但为了您的参考,以下链接会引导您了解其中一些内容

如果您选择应用程序级加载项模型来开发集成 IMSL C# 数值库的 Office 解决方案,则可以使用类似的资源。

结论

我们已经展示了如何通过 Visual Studio Tools for Office 接口开发和部署调用 IMSL C# 数值库的基于 Excel 的应用程序。一旦安装了所有必需的组件,交互就像使用任何 .NET 语言向电子表格添加代码,并像任何其他引用一样调用 IMSL C# 程序集一样简单。将电子表格单元格区域转换为数组并再次转换回单元格区域是通过命名范围实现的。图表组件可以像其他任何 .NET 组件一样添加。最后,部署需要理解安全设置。

最终用户应用程序可以按照 Microsoft 开发人员网络 (MSDN) 上概述的步骤进行分发。有关更多信息,请查阅本文档中的任何超链接,其中许多链接指向 MSDN 网页。如果您需要额外的专业知识或资源,Visual Numerics 的专家咨询服务 (Visual Numerics’ Expert Consulting Services) 也可为您的基于 IMSL 的应用程序提供帮助。

附录 A

以下步骤从 MSDN 中逐字复制,供您参考,以防该链接无法访问或页面已移动。

在本地计算机上授予程序集或文件夹完全信任

  1. 在“控制面板”中,打开“管理工具”。

  2. 运行“Microsoft .NET Framework 2.0 配置”。

    注意

    可能有几个类似的工具,其名称以“Microsoft .NET Framework”开头。请确保您使用的配置工具与您的运行时版本匹配。

  3. 在左侧的树状视图中,展开“.NET Framework 2.0 配置”,展开“我的电脑”,展开“运行时安全策略”,展开“用户”,展开“代码组”,展开“All_Code”,然后展开“VSTOProjects”。

    注意

    如果您之前没有编译过 Visual Studio Tools for Office 项目,则不会有 VSTOProjects 文件夹。您可以将新代码组添加到 All_Code 根节点,或者编译 Visual Studio Tools for Office 项目以自动创建 VSTOProjects 文件夹。

  4. 右侧是 VSTOProjects 代码组描述,页面底部有一个“任务”部分。在“任务”部分中,单击“添加子代码组”。

    创建代码组”向导启动。

  5. 选择“创建新代码组”,然后输入一个有助于您识别项目的名称和描述。单击“下一步”。

  6. 在“选择此代码组的条件类型”列表中,单击“URL”。

  7. 在“URL”框中,输入程序集的完整路径或项目 bin 文件夹的路径后跟星号(例如,c:\<path>\ExcelApplication1.dllc:\<path>\ExcelApplication1\bin\*)。

  8. 点击**下一步**。

    注意

    如果键入 bin 文件夹的路径,则该文件夹及其所有子文件夹中的所有程序集都将在您的计算机上获得完全信任。请确保未经授权的人员无法访问完全信任的文件夹,否则有人可能会在该文件夹中放置恶意程序集,并且该程序集将以完全信任运行。

    注意

    请勿将权限授予整个硬盘(例如 C:\*)或通用文件夹(例如“我的文档”),因为您可能会将权限授予来自互联网或电子邮件的缓存程序集。仅将权限授予包含您知道可以安全执行的程序集的特定项目文件夹。

  9. 选择“使用现有权限集”,然后从列表中选择“FullTrust”。

  10. 点击**下一步**。

  11. 点击**完成**。

使用代码访问安全策略工具 (Caspol.exe)

您还可以通过在命令提示符下使用代码访问安全策略工具 (Caspol.exe) 来授予文件夹完全信任。有关 Caspol.exe 的更多信息,请参阅代码访问安全策略工具 (Caspol.exe)。

您可以以普通用户权限在用户级别授予本地计算机上的文件夹信任。要授予网络位置信任,您必须具有管理员权限并在机器级别更改安全策略。机器策略级别独立于用户策略级别,并且即使用户策略授予内部网区域完全信任,机器策略级别也不会授予内部网区域完全信任。策略级别必须一致。

提示

请手动输入命令。将命令复制并粘贴到命令提示符中可能会导致“未知选项”错误。

授予本地文件夹信任

在 Visual Studio 命令提示符中输入以下命令

  • caspol -u -ag All_Code –url
  • C:\<FolderName>\<FolderName>\* FullTrust -n "<Name>" -d "<Description>"

有关更多信息,请参阅如何:使用 Caspol.exe 添加代码组。

了解更多

IMSL® C# 库可节省开发时间。欲了解更多信息或申请免费评估,请点击此处!您也可以预订 20% 的折扣,稍后购买!

IMSL® C# 与 Excel 和 VSTO:介绍和演练 - CodeProject - 代码之家
© . All rights reserved.