混合程序集能够同时包含非托管计算机指令和 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/n%s/n %s/n",
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/n%s/n %s/n",
temp->_strOriginatorFirstName->tochararray(),
temp->_strOriginatorLastName->tochararray(),
temp->_strQuote->tochararray());
}
}
int _tmain(int argc,_TCHAR* argv[])
{
//试试托管的CLR
//
AccessCrlService();
//试试内嵌汇编
//
__asm{
int 3; //产生一个断点
}
//试试原始的C++
//
AccessService();
return 0;
}
int _tmain(int argc,_TCHAR* argv[])
{
0041BEB0 push ebp
0041BEB1 mov ebp,esp
//试试托管的CLR
//
AccessCrlService();
0041BEB3 call AccessCrlService (405BB0h) //
//试试内嵌汇编
//
__asm{
int 3;
0041BEB8 int 3
}
//试试原始的C++
//
AccessService();
0041BEB9 call AccessService (41BEA0h)
return 0;
0041BEBE xor eax,eax
}
0041BEC0 pop ebp
0041BEC1 ret
跟进看一下,0041BEB3 call AccessCrlService (405BB0h) //
0041BEA0 jmp dword ptr [__mep@?AccessService@@$$FYAXXZ (4D9674h)]
__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