先说一下我的情况:
(1)我绝大部分的代码都是C++(VS2005 VC写的)dll
(2)用VS2010 + .net + C# + wpf写了个界面程序
想在C#中调用C++的dll,实际上我原来做过类似的工作,在C#调用user32.dll的函数,我现在有如下问题:
(1)c++的头文件很大(也就是结构非常多),我想大家不会只用基本数据类型吧,我需要把所有的dll输出头文件涉及到数据结构都转换成C#的,是不是有这样的工具?
(2)我的C++dll的输出函数没有采用c类型的名字输出,也就是说名字前后带有一些C++自动加的符号,我也不想将这些输出函数都强制转换成C类型名字,这样成不成?有什么方法可实现
(3)VC生成的dll都有指定明确的运行平台,如:x86,x64,没有C#类似的anyplatform,那么我引入dll时,是不是需要导入不同的版本的dll,用什么方式呢?#if #else?
(4)假如我的C++ dll有对象驱动的接口,也就是说,我的C++dll的输出头文件有些类,必须在应用中派生后使用,这个用C#重写这样的类,然后传入这个类的实例给dll,不知道可行不可行
我不知道说明白了没?

解决方案 »

  1.   

    同求,我是用VC6.0写的C++程序(形成了dll文件),想在VS2010中的窗体应用中引入该dll文件,该如何引入???
      

  2.   

    如果你的dll有2个版本(X86和X64),且导出函数命名相同,则直接更换不同的dll即可,C#是通过导出名来识别的。
    有批量转换导出函数的工具,但可靠性不高,有不少误判的情况,还需要人工修改,这里介绍一个"P/Invoke Interop Assistant"
    导出名不用C样式也可以找到,有这样的工具的,但是你必须一个个函数找其对应的后缀修改,且更不能使用导出工具了,显然和你另一个要求冲突。
    C#可以定义结构体和C++对应,并作为参数传递,类则不行,因为按照地址传递有各种问题,托管堆的地址和非托管堆的处理方式不一样。
      

  3.   

    (4)假如我的C++ dll有对象驱动的接口,也就是说,我的C++dll的输出头文件有些类,必须在应用中派生后使用,这个用C#重写这样的类,然后传入这个类的实例给dll,不知道可行不可行
    这个问题应该是这样解决,给你个连接,方法类似,我试过http://dongtingyueh.blog.163.com/blog/static/4619453201252712631541/
    对于要了解C#调用C/C++的,在给个连接http://wenku.baidu.com/view/5126f84b2b160b4e767fcf85.html?st=1