混合本机和托管程序集

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

相关文章

1.使用ajax调用varxhr;functioninvoke(){if(window.ActiveXO...
               好不容易把WebService服务器...
1新建一个工程项目用来做服务端增加一个MyService1类文件pac...
packagecom.transsion.util;importjava.io.BufferedReader;i...
再生产wsdl文件时重写描述文件1usingSystem;2usingSystem.Co...
一般情况下,使用eclipse自带的jax-ws生成webservice会自动生...