VC++ 非托管代码 & 托管代码

#pragma managed

#pragma unmanaged

看了好多好多非托管代码和托管代码之间相互调用,感觉都没有说在重点上,到底怎么用才是关键,理论的东西我们到微软官网上就可以找到,毕竟这个是微软创造的东西,说以这里就直说一下用法。

这里只说一下VC++,因为其他语言微软现在只支持.net了。也就是说C#和VB,开发出来的东西,基本上也就是.net的产物了(这个我也不是100%可定,至少在vs2008以后,只有VC支持非托管和托管混合了)。至于使用com之类的链接,可以跳过了。又不是底层开发,那个东西太繁琐了。

VC++支持托管和非托管代码混编,其实用的和简单,网上也有很多例子,不过我感觉太烦琐了。并且大部分是托管调用非托管代码(这个是有原因了,非托管代码比托管代码找的多,托管也是由于跨平台原因有微软提出的)。

 

#pragma managed和#pragma unmanaged是混编的关键所在。

.

#pragma managed

...托管代码...

#pragma unmanaged

...非托管代码

#pragma managed

...托管代码...

#pragma unmanaged

...非托管代码

 .

就是这么简单,在一个混编工程中,如果你写的是非托管代码,使用#pragma unmanaged进行声明,如果是托管代码,使用#pragma managed进行声明,生成的工程就是一个混编工程,其中既有托管代码又有非托管代码,工程中的非托管代码和托管代码实现的函数和方法是可以互相调用的。只不过要注意类型,如果是字符串的话,还需要注意编码方式。工程要使用/clr(公共语言支持)就可以了。

既然有了混编工程,那么纯非托管和纯托管工程代码直接的调用就就不成问题了。

 

这里有的时候会出bug,找不到外部引用,我用vs 2012测试,就是关联工程之间不好使,要手动把生成的库指定到依赖工程的库中,不能通过工程之间的依赖引用来实现。可能是公共语言支持选项对工程引用起到了限定作用吧。

 

纯非托管  <-> 混编  <->   纯托管

 

止于此。。。

posted @ 2015-01-15 13:11  知己而已  阅读(696)  评论(0编辑  收藏  举报