随着.NET框架的发展,开发工作变得更加简单。不再需要担心使用C++中的ATL包装器来访问VB组件,或者在尝试与FORTRAN代码接口时调用约定。所有.NET支持的语言现在都是一等公民,并且可以无缝地相互操作,这不仅使得不同的系统能够比以往更容易地协同工作,也使得具有不同技能的开发者能够和谐地共同参与项目。
在一种语言中创建可以在另一种语言中使用的组件非常简单。使用Visual Studio.NET向导创建最喜欢的.NET语言的类库,编译它,然后就完成了。
例如,将在C#中创建一个简单的类,它公开了两个方法:
namespace MyCSClass
{
using System;
public class CSClass
{
public CSClass() { }
// 返回传入字符串的长度
public int MyMethod(string str)
{
return str.Length;
}
// 返回传入数字的平方
public virtual int MyVirtualMethod(int n)
{
return n * n;
}
}
}
第一个方法MyMethod接受一个字符串对象并返回其长度。第二个方法是虚拟的,返回传入数字的平方。假设已将此组件编译为MyCSClass.dll。
要使用托管C++使用此组件,首先需要将程序集导入程序:
#using "MyCSClass.dll"
就是这样。没有类型库,没有.def文件,没有ATL头文件。只需使用#using语句(并确保dll在编译器的搜索路径中),然后让编译器完成其余的工作。
一旦导入了类,可以使用using声明来节省打字:
MC++ using namespace MyCSClass;
注意这里的不同:#using用于将程序集导入项目。using指定将要使用的命名空间,并且只是节省打字。
实际使用类就像在.NET中使用任何其他托管引用类型一样:
MC++ CSClass *cs = new CSClass();
int result;
result = cs->MyMethod("Hello World");
// 将返回11
result = cs->MyVirtualMethod(2);
// 将返回2的平方
跨语言互操作性不仅仅简化了使用不同语言编写的组件。还可以从其他语言编写的组件中继承新类,而不需要组件的原始源代码。
想象一下,购买或以其他方式获得了一些非常喜欢使用的超酷组件,但希望它有一到两个更多的功能,或者它做了一些稍微不同的事情。在.NET中,可以从该组件继承一个新类,以创建一个完全按照喜好工作的组件。不是在为组件创建包装器:正在创建一个新组件,它继承了属性、方法和字段,并且可以覆盖旧组件的虚拟方法并添加新方法。
回到例子。方法CSClass::MyVirtualMethod是虚拟的,所以让声明一个新的C++类,它派生自这个C#类,并覆盖那个虚拟方法:
MC++ __gc class CPPClass : public MyCSClass::CSClass
{
public:
// 返回给定数字的立方
virtual int MyVirtualMethod(int n)
{
return n * n * n;
}
};
用新方法覆盖了CSClass::MyVirtualMethod,它返回给定数字的立方,而不是平方。一旦编译了代码,就有一个新的C++组件,它覆盖了C#类中的虚拟方法,并且也有非虚拟的MyMethod()函数。
MC++ CPPClass *cpp = new CPPClass();
int result;
result = cpp->MyMethod("Hello World");
// 将返回11
result = cpp->MyVirtualMethod(2);
// 将输出2的立方,而不是2的平方