跨语言互操作性:.NET框架的简便性

随着.NET框架的发展,开发工作变得更加简单。不再需要担心使用C++中的ATL包装器来访问VB组件,或者在尝试与FORTRAN代码接口时调用约定。所有.NET支持的语言现在都是一等公民,并且可以无缝地相互操作,这不仅使得不同的系统能够比以往更容易地协同工作,也使得具有不同技能的开发者能够和谐地共同参与项目。

创建.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++中使用.NET组件

要使用托管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的平方

本文附带的下载包含一个C#和一个VB.NET组件,这些组件被C++组件使用和继承

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485