问题情景: 1、数据库访问的底层操作,我是自己写的数据库类,语言C++ ,用到了stl中的vector,string
2、web page用的是C# 问题: C#中,如何调用C++的内容,C++中的函数,我知道用dllimport的方式,可以将dll导入使用,可是对于在C++中,自己定义的类,如何在C#中使用呢?? 希望的解决方式: 给出C#调用C++的部分代码,其中C++中,用到了vector,string,是自己定义的类,以及结构体此外的我的数据库操作有多个类
底层:数据库操作类
中间:数据表映射类(多个)
上层:统一封装接口类,所以怎么封装比较好呢?本人初次接触这个问题,请尽量详细点吧,觉得分不够,可以另外开贴送分。 

解决方案 »

  1.   

    自己顶一下,这问题烦了我一星期了,谁能给解答一下,感激不尽之前有csdn的朋友给了一些提示,可还是没有完全解决
      

  2.   

    你先建立一个C++ 的Dll项目,把你所有C++代码编译以后就会生成一个Dll文件吧,然后在C#项目里导入这个Dll文件,就可以用里面的函数了
      

  3.   

    C#无法使用C++导出的类,建议把C++导出的类封装为COM接口
      

  4.   

    恩,如何封装成com接口,网上的资料太少了,能否给个demo?
    对了,里面设计的stl的东西,怎么办,也能完全解决么?
      

  5.   


    《深入解析ATL》可以解决你的问题.
    不过就你的问题来看,这样做工作量不小,还不如把接口改成基本数据类型.方便使用
      

  6.   


    由于牵涉到数据库操作,会涉及返回数据集,所以很难全部用基本类型,另外数据集还是自定义的不是mfc的东西,痛苦的等答案
      

  7.   

    VC里面用ATL搞成COM还真不方便,我现在还不知道原本不是ATL项目,如何把它改成支持ATL的
      

  8.   

    用xml什么的拼成一个字符串,不就解决了么?
      

  9.   

    http://blog.hidotnet.com/venjiang/articles/38.aspx
    http://www.pinvoke.net/default.aspx/netapi32/NetShareEnum.html
    有一票例子,你对照C++的头文件中的函数原形和类型看下就好,
    应该是windows.h  系统api.
      

  10.   

    to akirya要是用xml串来做类型转换,一方面影响了效率,要生成和解析
    另外,数据集是一个比较复杂的类,还提供了不少方法,如果,拼成xml串,那解析都很痛苦
    帅哥们,还有什么好的方法啊?
      

  11.   

    给条明路吧,现在是c++中的类(涉及stl),c#用不成我在你给的网址里面,没看到希望啊
      

  12.   

    感动啥?我贴都没看就回贴了.
    3楼才是正确的办法.C++的com组件写的合理的话,注册后,一个右键引用就能使用.
      

  13.   

    我给你找个例子,创建com组件,大部分代码都是生成的.________________________________________________________[
    object,
    uuid("E6A596F0-01DB-4D35-83FD-C5FD09F21696"),
    dual, helpstring("IEeaCli Interface"),
    pointer_default(unique)
    ]
    __interface IEeaCli : IDispatch
    {
    HRESULT  Create      (   [in] BSTR src_filename,[out,retval] BSTR * stb_filename );  
    HRESULT  Open        (   [in] BSTR stb_filename  ); 
    HRESULT  SetClientID  (   [in] BSTR clientid );
    HRESULT  GetClientID  (   [out,retval] BSTR *clientid );
    HRESULT  SetHashCode (  [in] BSTR hashcode );
    HRESULT  GetHashCode (  [out,retval] BSTR * hashcode );
        HRESULT  SetTargetPath ( [in] BSTR src_file_name );   
        HRESULT  GetTargetPath ( [out,retval] BSTR * src_file_name );   
        HRESULT  GetTargetFileInfor([out,retval]  IEeaFileInfo** ifinfo );
        HRESULT  SetTargetFileInfor([in]  IEeaFileInfo * ifinfo );};   你使用标准的com ,在注册后,用vs的添加引用-->com引用就可以.我说的那个写成函数库自己写封送那太罗嗦了,封送没个统一的标准,100人封100个样出来.
      

  14.   

    我在三楼说的方法完全可行,我做过的。 .NET平台提供了语言不相关性,为什么还要小题大做用COM呢。
      

  15.   

    楼上说的是.net平台。 而如果c++工程不是.net平台的 呢? 
    我有一个解决方案。
    用c++ cli 建立一个中间工程。 通过c++ cli 去调用native cpp。