我们最近在用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#里调用
我们本打算将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#里调用
解决方案 »
- 请问如何根据textbox里面文本的长度动态设置合适的textbox控件的宽度?
- 这个循环里的正则表达式的局部变量,如何写到循环外面去,以减少内存消耗?
- 如何动态获得objectset
- visual studio 连接数据库问题
- datagridview中的textbox的leave事件
- c# winform控件突然无法拖拽移动
- 请 ps1234 老大,指导一下,谢谢!
- C#里如何把textBox里的值导入WORD
- 就是还有一个小问题哦 就是听到datagridview里时 怎么显示蓝色的覆盖的 能不能不要显示这样的 直接有个 ¦停在那里啊
- 在winform程序中如何sqlserver中的image字段的内容存成word文档?
- 关于c#中connection.cs页面出现未处理NotlmplementedException异常
- 如何远程在局域网下另外一台电脑上执行CMD命令?或者远程关机?
1.平台调用技术(P/Invoke)
2.C++ Interop
3.COM Interop
参照lz的需求,也只能是第1种方案,
平台调用有限制,必须是flat API(WIN32 API,C/C++风格 API)所以必须要对现有的c++模块进行封装;
方案2不需要封装,但是需要使用 托管c++;
如果要实现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就可以调用了
更细节的可以搜混合编译托管和非托管代码