混合(本机和托管)程序集
混合程序集能够同时包含非托管计算机指令和 MSIL 指令。这使它们可以调用 .NET 组件或被其调用,同时保留与完全非托管组件的兼容性。使用混合程序集,开发人员可以混合使用托管和非托管功能创作应用程序。这使得混合程序集成为将现有 Visual C++ 应用程序迁移到 .NET 平台的理想选择。 例如,通过使用 /clr 编译器开关仅重新编译一个模块,就可将完全由非托管函数组成的现有应用程序迁移到 .NET 平台。然后,此模块就可以使用 .NET 功能,但是仍保留与应用程序的其余部分的兼容性。通过此种方式,应用程序可以按渐近、逐个部分的方式转换到 .NET 平台。甚至可以决定在同一文件内每个函数的基础上进行托管或非托管编译 我们可以轻松移植之前的纯C++代码,使它可以享受托管带来的新功能: 例子: step1,新建一个win32的console工程。 step2.在项目属性->常规->公共语言运行库支持,选择,"公共语言运行库支持(/clr)" 你的工程就可以使用托管和非托管的C++混合编程了,甚至混合内嵌的x86汇编语言。 呵呵,很好很强大! 下面是调用使用一个WebService的例子:
void
?AccessService()
... { ?QuoteService::CQuoteService?ws; ?for(int?i=0;i<10;i++) ?...{ ??QuoteService::Quote?temp; ??HRESULT?hr?=?ws.GetAQuote(&temp); ??if(SUCCEEDED(hr)) ??...{ ???wprintf(L"%s %s ?%s ", ????temp._strOriginatorFirstName, ????temp._strOriginatorLastName, ????temp._strQuote); ??} ?} } ? void ?AccessCrlService() ... { ?//构造托管类型,?不是使用new?哦,使用gcnew.. ?// ?WebReference1::QuoteService^?ws?=?gcnew??WebReference1::QuoteService; ?for(int?i=0;i<10;i++) ?...{ ??WebReference1::Quote^?temp?=??ws->GetAQuote(); ?? ??//使用标准的C运行库来打印托管类型,?system::String?转为?char* ??// ??printf("%s %s ?%s ", ???temp->_strOriginatorFirstName->ToCharArray(), ???temp->_strOriginatorLastName->ToCharArray(), ???temp->_strQuote->ToCharArray()); ?} ? } int ?_tmain( int ?argc,?_TCHAR * ?argv[]) ... { ??//试试托管的CLR ??// ??AccessCrlService(); ??//试试内嵌汇编 ??// ??__asm...{ ??int?3;?//产生一个断点 ?} ? ??//试试原始的C++ ??// ??AccessService(); ??return?0; } ? 看看生成PE文件的代码: int _tmain(int argc,_TCHAR* argv[]) ? //试试托管的CLR ? //试试内嵌汇编 ?跟进看一下,0041BEB3? call??????? AccessCrlService (405BB0h)? // __mep@?AccessService@@$$FYAXXZ:004D9674? push??????? es?? 004D9675? mov???????? cl,0F8h 004D9677? add???????? byte ptr [edx-4Fh],al 004D967A? clc????????????? 004D967B? add???????? byte ptr [esi-4Fh],bh 004D967E? clc????????????? 004D967F? add???????? byte ptr [edx-0BFF074Fh],bh 004D9685? adc???????? cl,byte ptr [edi] 004D9688? sub???????? al,74h 004D968A? inc???????? esp? 004D968B? add???????? dh,dh 004D968D? mov???????? cl,0F8h 004D968F? add???????? byte ptr [edx],dh 004D9691? mov???????? dl,0F8h 004D9693? add???????? byte ptr [esi-4Eh],ch 004D9696? clc????????????? 004D9697? add???????? byte ptr [edx-19FF074Eh],ch 004D969D? mov???????? dl,0F8h 004D969F? add???????? byte ptr [edx],ah 004D96A1? mov???????? bl,0F8h 004D96A3? add???????? byte ptr [esi-4Dh],bl 004D96A6? clc????????????? 004D96A7? add???????? byte ptr [edx-29FF074Dh],bl 004D96AD? mov???????? bl,0F8h 004D96AF? add???????? byte ptr [edx],dl 004D96B1? mov???????? ah,0F8h 004D96B3? add???????? byte ptr [esi-4Ch],cl 004D96B6? clc????????????? 004D96B7? add???????? byte ptr [edx-39FF074Ch],cl 004D96BD? mov???????? ah,0F8h 004D96BF? add???????? byte ptr [edx],al 004D96C1? mov???????? ch,0F8h 004D96C3? add???????? byte ptr [esi],bh 004D96C5? mov???????? ch,0F8h 004D96C7? add???????? byte ptr [edx-4Bh],bh 004D96CA? clc????????????? 004D96CB? add???????? byte ptr [esi-0DFF074Bh],dh 004D96D1? mov???????? ch,0F8h 004D96D3? add???????? byte ptr [esi],ch 004D96D5? mov???????? dh,0F8h 004D96D7? add???????? al,al 004D96D9? pop???????? ecx? 004D96DA? dec???????? ebp? 004D96DB? add???????? byte ptr [eax+200041C3h],al 004D96E1? ret?????? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |