C#调用C++的类

这里讲C#调用C++的类,也是我真正想要的做的。网上关于这方面的知识挺杂,我折腾了好久终于搞定了。

大致有两种方法。第一种C#直接调,用到System.Runtime.InteropServices中的Marshal类,貌似这样可能通过直接操纵内存来实现调用,但我没有尝试;第二种方法是用managed C++包装native C++,然后供C#调用。这里详细讲一下这种方法,并基本考虑到了所有的情况。

//nativecpp.h
  //nA不是C#调用对象,nB是,但nB中用到了nA类
  class __declspec( dllexport ) nA //有人提醒我__declspec( dllexport )可以加在方法前面,//但不要加在类前面,否则会出现问题.但我去掉后编译就出错了。
 {
     char* Ama;
     int Afoo();
 };
  //nB基本已经涵盖了所有的情况
  class __declspec( dllexport ) nB
 {
     nA Bma;
     int Bmb;
     nA BmArr[];
     bool Bfoo( char* a, nA[] b); //假设主要想调用这个函数,则包装时只要包装这个即可
 };


用managed C++包装。在vs2008中建工程时选CLR Class Library即可。添加对上面生成的nativecpp.dll的引用。这里我的引用采用了C#的add reference的形式,而不是传统C++在linker中添加.lib的方式。

#include "nativecpp.h"
  using namespace System;
 
  namespace managecpp{
     public ref class mA
     {
         private:
             nA* aptr;
         public:
             mA(): aptr(new nA())    {}
             ~mA()   { delete aptr; }
             nA getA()
             {
                 return *aptr;
             }
     };
     public ref class mB
     {
         private:
             nB* bptr;
         public:
             mB(): bptr( new(nB) )   {}
             ~mB()   { delete bptr; }
             bool mBoo( System::String ^a, array<mA^> ^b, int count) //数组的包装,//这里'^'的含义我不太明白,这里a, b都是指针
              {
                 //string转成char*
                  cli::array<wchar_t,1> ^ aArr = a->ToCharArray();
         const int nLength = aArr->Length;
         char * ap = new char[nLength + 1];
         for (int x = 0; x < nLength; ++x)
         {
             ap[x] = static_cast<char>(apArr[x]);
         }
         ap[nLength] = 0;
                 //array<mA>转成mA[]
                  mA *newb = new mA[count];
                 for( int i = 0; i < count; i++)
                 {
                     newb[i] = b->getA();
                 }
                 bool rel = bptr->nBfoo(ap, newb);
                 delete[] aArr;
                 delete[] newb;
                 return rel;
             }
     };
 }


剩下的是c#调用的代码。首先要添加对managecpp.dll的引用,另外要将nativecpp.dll拷贝到bin目录下(无法理解)。

 

namespace cscallcpp
 {
     public class csB
     {        
         bool csBoo(String a, csA[] b)
         {
             mB mb = new mB();
             return mb.mBoo(a, b); //实例化后正常调用即可
         }
     }
 }


我主要纠结的是在native c++中定义的类型的数组如何包装的问题,最后采用的方法比较挫,又创建了一个数组,然后赋值,这在空间、效率上都不咋的。请高人赐教。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值