我们最近在用C#做界面,同时底层的程序是用C++写的,我们想让C#调用C++程序。
我们本打算将C++封装成DLL来让C#调用,但是一个函数一个函数的封装调用很麻烦,另外我们的C++里有一个模板类叫做matrix,相当于一种叫做矩阵的数据类型,我们考虑在C#中用intptr代替这种类型的数据,但是不知道怎么把intptr指向的值输出到界面上,直接输出得到的值都是地址,intptr类型又不像C++的指针一样可以加*获取变量的值。另外我们还考虑另一种办法,就是让C#直接运行C++的exe,再把C++的运行结果写到txt里再让C#读它。但是界面的功能需要每过一段时间让C++程序中的一个变量+1,这样直接运行C++的exe没法改里边的代码。以下是C++中的matrix类template <class _Ty>
class matrix
{
typedef matrix<_Ty> _Myt; private:
std::valarray<_Ty> m_Datas; //定义一维数组对象m_Datas
size_t m_stRow; //矩阵行数变量
size_t m_stCol; //矩阵列数变量类
public:
/*矩阵类matrix的构造函数一
构造函数中出现的m_Datas为valarray类的对象,申请stRow * stCol个单元,
单元内没赋值。对数组对象m_Datas使用了valarray类的构造函数:*/
matrix(size_t stRow, size_t stCol)
: m_Datas(stRow * stCol),
m_stRow(stRow), m_stCol(stCol)
{
m_Datas.resize(GetRowNum() * GetColNum(), _Ty(0));}
/******
 矩阵类matrix的构造函数二
     对私有变量m_stRow和m_stCol分别赋初值stRow, stCol。
     对数组对象m_Datas使用了valarray类的构造函数:
valarray(const _Ty *p, size_t n)
 m_Datas初始化的第一参数为矩阵rhs指针,第二个参数为rhs的元素总个数,
 即rhs行数*列数
******/
matrix(const _Ty* rhs, size_t stRow, size_t stCol)
: m_Datas(rhs, stRow * stCol),
m_stRow(stRow), m_stCol(stCol)
{
}
/******
 矩阵类matrix的构造函数三
     用引用矩阵rhs的数组对象m_Datas初始化matrix所定义对象的m_Datas,
 用引用矩阵rhs的行数rhs.GetRowNum()和列数rhs.GetColNum()分别初始化私
 有变量m_stRow和m_stCol
******/
matrix(const _Myt& rhs)
: m_Datas(rhs.m_Datas),
m_stRow(rhs.GetRowNum()), m_stCol(rhs.GetColNum())
{
} size_t GetRowNum() const //返回矩阵行数的函数
{
return m_stRow;
} size_t GetColNum() const //返回矩阵列数的函数
{
return m_stCol;
}
}请教各位大神如何把上边这个类型的变量在C#里调用

解决方案 »

  1.   

    托管代码与非托管代码进行交互操作的解决方案主要包括三种:
    1.平台调用技术(P/Invoke)
    2.C++ Interop
    3.COM Interop
    参照lz的需求,也只能是第1种方案,
    平台调用有限制,必须是flat API(WIN32 API,C/C++风格 API)所以必须要对现有的c++模块进行封装;
    方案2不需要封装,但是需要使用 托管c++;
      

  2.   

    https://www.cnblogs.com/zeroone/p/4199141.html
      

  3.   

    有一种叫做CallBack的方式,可以直接把C++里面的自定义结构体传给C#调用,可以用这种方式将C++ 的模板类数据赋值给结构体,然后传给C#,传值只需要一个指针即可
      

  4.   

    那么CallBack这种方式该怎么做呢
      

  5.   

    c++ Interop 的处理基本流程
    如果要实现c++类,则需要使用托管c++编写包装类,
    将所调用的c++类的方法暴露给调用者class  CUnmanagedClass;  //前置声明public ref class CAppWapper
    {
    public:
            CAppWapper(); 
            virtual  ~CAppWapper();
           //封装功能接口
           ...
    private:
          CUnmanagedClass*   m_pObj;       
    }思路是使用ref关键字及托管数据类型定义一个托管c++类
    对于blittleable类型的如Int,不需要转换
    对于non-blitleable类型的如字符串则需要封装转换
    封装后符合CLS规范的c++类,c#或者vb.net就可以调用了
    更细节的可以搜混合编译托管和非托管代码