混合(本机和托管)程序集

 

混合程序集能够同时包含非托管计算机指令和 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;
}

看看生成PE文件的代码:

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      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值