C# 通过 CLR 调用C++ 代码

ysuliu 2015-10-13 06:41:44
我需要在 C# winForm 程序中,使用很多C++的算法代码。
目前的方案是使用一个 CLR 的 DLL来实现。

目前的问题是,很多C++算法的函数参数都是 int + double* ,传递一个 double数组的长度和内容。。同时计算结果也以 double* 的方式写回

C++ 函数声明:
int func(int count, double* valList, double* result); // count 和 valList是传入参数,result 是保存计算结果

这在C# 和 CLR 的类定义中怎么传递参数呢?


下面是我的代码结构示例:
Solution:
-- CLR 类库
-- C++ 算法代码
-- CLR 封装类,封装C++函数调用
-- WinForm 应用(引用以上类库工程)
-- C# 代码,调用CLR类的API



小弟.net 初学者,希望能给出代码示例,包含CLR类和C#代码中的声明和使用,非常感谢。。。。

...全文
337 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysuliu 2015-10-15
  • 打赏
  • 举报
回复
暂时放弃使用 CLI 了,问题暂时解决。。多谢各位。。
Poopaye 2015-10-14
  • 打赏
  • 举报
回复
声明
[DllImport(dll文件名)]
static extern int func(int count, double[] valList, double[] result);


调用
double[] valList = new double[]{1,2,3};
double[] result = new double[valList.Length];
int x = func(valList.Length, valList, result);
ysuliu 2015-10-14
  • 打赏
  • 举报
回复
自己顶一下,还有人帮忙解答吗?谢谢
宝_爸 2015-10-14
  • 打赏
  • 举报
回复
我的实验代码,测试通过。 C#端调用:

            CLILib.Class1 cls = new Class1();

            double[] d1 = {0.1, 0.2, 0.3, 0.4};
            double[] d2 = new double[d1.Length];

            cls.func(d1, d2);

CLI和C++的代码:

	public ref class Class1
	{
	public:
		int func(array<double>^ valList, array<double>^ result)
		{
			int length = valList->Length;
			pin_ptr<double> pvalList = &valList[0];
			pin_ptr<double> pResult = &result[0];

			return internalFunc(length, pvalList, pResult);
		}

	private :
		int internalFunc(int count, double* pvalList, double* pResult)
		{
			for(int i = 0; i< count; ++i)
			{
				pResult[i] = pvalList[i];
			}

			return 0;
		}
		
	};
宝_爸 2015-10-14
  • 打赏
  • 举报
回复
你的CLR是写错了吗? 应该是CLI吧。 CLI封装一层也是可以的。CLI的接口符合C#标准即可,内部调用C++的函数。 类似于这样的接口 int func(double[] valList, out double[] result);
b_duan 2015-10-14
  • 打赏
  • 举报
回复
先把c++代码封装成dll,然后c#调用这个dll。你那种方案还真不知道可不可行
b_duan 2015-10-14
  • 打赏
  • 举报
回复
建议查.net互操作的资料,就是专门讲.net与非托管的交互的
本拉灯 2015-10-14
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/lovepc1/6463003 精通.NET互操作PInvoke,C++ Interop和COM Interop 你要的是这个,这里有完整的
ysuliu 2015-10-13
  • 打赏
  • 举报
回复
引用 1 楼 ajianchina 的回复:
你可以私信我你的邮箱,我将整理的一个文档发给你。


私信了,多谢。。
ajianchina 2015-10-13
  • 打赏
  • 举报
回复
你可以私信我你的邮箱,我将整理的一个文档发给你。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧