论坛首页 编程语言技术论坛

It Just Works

浏览 1534 次
锁定老帖子 主题:It Just Works
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-20  
在托管与本机环境中,使用.NET 互操作有四种主要途径: 使用Runtime Callable Wrappers(RCW)与COM Callable Wrappers(CCW)进行COM互操作;使用P/Invoke;使用CLR宿主;或者使用C++的互操作功能。

VC++ 互操作技术被称为IJW或“正常运行(It Just Works)”。于每个本机方法而言,编译器同时创建了一个托管的入口点和一个非托管的入口点。它们中只有一个是真正方法的实现,另一个则是转发器,可进行相应的转换和必要的调度。通过设置/clr开关,编译器会生成中间代码(MSIL)而不是本机代码,对于那些无法被编译成中间代码的代码,比如带有内联asm块的函数,以及使用Streaming SIMD Extensions (SSE)这样一些特定于CPU的固有特性的操作,则生成本地代码。在不添加任何附加的二进制文件而只是简单地加入适当的头文件的情况下,托管C++和本地C++可以相互调用,而无需部分开发人员做一些额外的工作。编译器负责创建适当的)转换代码来往返在两种环境之间。这是为什么这种互操技术被称为“It Just Work”。

一个成功的案例就是Quake II.Net,Vertigo软件小组花费了一天的时间就将原来由C编写的游戏代码成功地编译成C++代码,然后设置了/clr开关。他们的代码很快就可以运行在.NET框架上。

这里是一个例子


#include <windows.h>

using namespace System;
using namespace System::Runtime::InteropServices;

public ref class MsgBox
{
	public:
		MsgBox(System::String^ str)
		{
			IntPtr ptrtxt = Marshal::StringToCoTaskMemUni(str);
			MessageBoxW(0,(LPCWSTR)ptrtxt.ToPointer(),L"It is cool",0);
			Marshal::FreeCoTaskMem(ptrtxt);
		}
};

int _tmain(void)
{
    MsgBox^ m_msgbox = gcnew MsgBox("Hello,World");
    return 0;
}


论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics