演练:创建和使用托管程序集 (C++)

简介:

托管程序集是一种库,您可以创建该库以便高效地重用代码。 这样,就不必在多个程序中重新实现同样的例程,而只需编写这些例程一次,然后在需要该功能的应用程序中引用它们即可。

本演练涵盖以下任务:

  • 创建一个类库项目。

  • 向该类库添加类。

  • 创建引用该类库的应用程序。

  • 在应用程序中使用类库的功能。

  • 运行应用程序。



若要完成本演练,您必须了解 C++ 语言的基础知识。 如果您刚刚开始学习 C++,建议阅读 Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),MSDN 网站上的 Beginner Developer Learning Center(入门开发人员学习中心)提供了该指南。

创建类库项目
  1. 在“文件”菜单上指向“新建”,然后单击“项目”。

  2. 在“项目类型”窗格中,选择“Visual C++”下的“CLR”。

    此组中的每个项目类型都将创建一个面向公共语言运行时 (CLR) 的项目。

  3. 在“模板”窗格中,选择“类库”。

  4. 在“名称”框中键入项目的名称,例如,MathFuncsAssembly。 在“解决方案名称”字段中键入解决方案的名称,例如,ManagedAssemblies。

  5. 单击“确定”创建项目。

  6. 默认情况下,在创建项目时,会将项目设置为使用预编译头。 若要为 MathFuncsAssembly 项目禁用预编译头,请在“解决方案资源管理器”中选择项目,然后在“项目”菜单上,单击“属性”。 依次展开“配置属性”节点和“C/C++”节点,然后选择“预编译头”。 在“创建/使用预编译头”旁边的列表中,选择“不使用预编译头”。 单击“确定”保存这些更改。 有关更多信息,请参见创建预编译的头文件

向类库添加类
  1. 在您创建 CLR 类库后,向导将为您生成一个基本类。 生成的头文件和源文件的名称均与您在创建项目时为项目指定的名称相同。 在本示例中,它们的名称为“MathFuncsAssembly.h”和“MathFuncsAssembly.cpp”。

  2. 通过使用一个名为 MyMathFuncsAssembly 的基本类,替换 MathFuncsAssembly.h 中的现有代码。 此类执行一些常见的算术运算,例如加、减、乘和除。 代码应与下面的示例类似。

 

// MathFuncsAssembly.h

using namespace System;

namespace MathFuncs
{
    public ref class MyMathFuncs
    {
    public:
        // Returns a + b
        static double Add(double a, double b);

        // Returns a - b
        static double Subtract(double a, double b);

        // Returns a * b
        static double Multiply(double a, double b);

        // Returns a / b
        // Throws DivideByZeroException if b is 0
        static double Divide(double a, double b);
    };
}

在源文件中实现 MyMathFuncs 的功能。 代码应与下面的示例类似。

// MathFuncsAssembly.cpp
// compile with: /clr /LD

#include "MathFuncsAssembly.h"

namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }

    double MyMathFuncs::Multiply(double a, double b)
    {
        return a * b;
    }

    double MyMathFuncs::Divide(double a, double b)
    {
        if (b == 0)
        {
            throw gcnew DivideByZeroException("b cannot be zero!");
        }

        return a / b;
    }
}

  1. 编译该类库,方法是在“生成”菜单中单击“生成解决方案”。 这将创建一个可供其他程序使用的动态链接库 (DLL)。 有关 DLL 的更多信息,请参见 DLL

创建引用类库的控制台应用程序
  1. 在“文件”菜单上指向“新建”,然后单击“项目”。

  2. 在“项目类型”窗格中,选择“Visual C++”下的“CLR”。

  3. 在“模板”窗格中,选择“CLR 控制台应用程序”。

  4. 在“名称”框中键入项目的名称,例如,MyExecRefsAssembly。 在“解决方案”旁边的列表中,选择“添入解决方案”以将新项目添加到包含类库的解决方案中。

  5. 单击“确定”创建项目。

  6. 在“解决方案资源管理器”中选中 MyExecRefsAssembly 项目,然后在“项目”菜单上,单击“属性”,为该项目禁用预编译头。 依次展开“配置属性”节点和“C/C++”节点,然后选择“预编译头”。 在“创建/使用预编译头”旁边的列表中,选择“不使用预编译头”。 单击“确定”保存这些更改。

在控制台应用程序中使用类库的功能
  1. 在您创建 CLR 控制台应用程序后,向导将生成一个仅向控制台写入“Hello World”的程序。 生成的源文件的名称与您在创建项目时为项目指定的名称相同。 在本示例中,名称为“MyExecRefsAssembly.cpp”。

  2. 若要使用在类库中创建的算术例程,必须引用类库。 为此,请在“解决方案资源管理器”中选择 MyExecRefsAssembly 项目,然后在“项目”菜单上,单击“属性”。 在“属性页”对话框中展开“通用属性”节点,选择“框架和引用”,然后单击“添加新引用”。 有关更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”

  3. “添加引用”对话框列出了所有可以引用的库。 “.NET”选项卡列出了 .NET Framework 附带的库。 “COM”选项卡列出了计算机上的所有 COM 组件。 “项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。 在“项目”选项卡上,选择“MathFuncsAssembly”,然后单击“确定”。


    通过包括 #using 指令(例如 #using <MathFuncsAssembly.dll>),您可以直接从源文件引用程序集。 有关更多信息,请参见#using Directive (C/C++)

  4. 现在即可在此应用程序中使用 MyMathFuncs 类。 在 MyExecRefsAssembly.cpp 中,使用下面的代码替换文件函数的内容。

// MyExecRefsAssembly.cpp
// compile with: /clr /FUMathFuncsAssembly.dll

using namespace System;

int main(array<System::String ^> ^args)
{
    double a = 7.4;
    int b = 99;

    Console::WriteLine("a + b = {0}",
        MathFuncs::MyMathFuncs::Add(a, b));
    Console::WriteLine("a - b = {0}",
        MathFuncs::MyMathFuncs::Subtract(a, b));
    Console::WriteLine("a * b = {0}",
        MathFuncs::MyMathFuncs::Multiply(a, b));
    Console::WriteLine("a / b = {0}",
        MathFuncs::MyMathFuncs::Divide(a, b));

    return 0;
}

  1. 通过在“生成”菜单上,单击“生成解决方案”来生成可执行文件。

运行应用程序
  1. 通过在“解决方案资源管理器”中选择 MyExecRefsAssembly,然后在“项目”菜单上,单击“设为启动项目”,从而确保选择 MyExecRefsAssembly 作为默认项目。

  2. 若要运行项目,请在“调试”菜单上,单击“开始执行(不调试)”。 输出应与下面的示例类似。

    a + b = 106.4
    a - b = -91.6
    a * b = 732.6
    a / b = 0.0747474747474748
目录
相关文章
|
27天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
113 0
|
1月前
|
编译器 Linux C++
3C++程序的编写和实现
3C++程序的编写和实现
17 2
|
1月前
|
C++ 开发者
2C++的程序的构成和书写形式
2C++的程序的构成和书写形式
16 2
|
4月前
|
JavaScript 前端开发 Serverless
函数计算只支持Node.js,我用C++写的程序怎么运行?
函数计算只支持Node.js,我用C++写的程序怎么运行?
91 1
|
22天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
1月前
|
缓存 编译器 程序员
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
62 0
|
1月前
|
缓存 编译器 程序员
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化
27 0
|
1月前
|
缓存 算法 编译器
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
39 0
|
1月前
|
自然语言处理 编译器 调度
深入gcc编译器:C/C++代码如何变为可执行程序
深入gcc编译器:C/C++代码如何变为可执行程序
77 0
|
1月前
|
并行计算 安全 编译器
【C/C++ 编译相关 gcc】一次搞懂GCC编译选项:优化代码、调试程序必备!
【C/C++ 编译相关 gcc】一次搞懂GCC编译选项:优化代码、调试程序必备!
34 0

热门文章

最新文章