首页 新闻 会员 周边 捐助

C# 引用C++ 函数

0
悬赏园豆:50 [已解决问题] 解决于 2012-01-12 15:28

C++部分:

WIN32LIB_API double* range(double* res)
{
 int x;
 int y;

 //sizeof 得到元素个数,并非数组长度   从大到小排列
 for(int i=0;i<3;i++)
 {
  x=res[i];
  for(int j=i+1;i<3;j++)
  {
   if(x>res[j])
   {
    x=res[j];
    res[j]=res[i];
    res[i]=x;
    
   }
  }
 }
 return res;

C#  引用部分

[DllImport(@"C:\Users\xnguo\Documents\Visual Studio 2010\Projects\Csharp封装C++\Debug\win32Lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        public static extern double[] range([MarshalAs (UnmanagedType.LPArray ,SizeParamIndex =0)]double [] x);

C#中调用range时抛出异常Cannot marshal 'return value': Invalid managed/unmanaged type combination.

求大神帮我把这快代码调试出来能运行

郭小宁的主页 郭小宁 | 初学一级 | 园豆:112
提问于:2012-01-06 17:41
< >
分享
最佳答案
0
[DllImport(@"C:\Users\xnguo\Documents\Visual Studio 2010\Projects\Csharp封装C++\Debug\win32Lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
[return:MarshalAs (UnmanagedType.LPArray ,SizeConst=3)]
public static extern double[] range([MarshalAs (UnmanagedType.LPArray ,SizeConst=3)]double [] x);
收获园豆:20
Greatest | 小虾三级 |园豆:678 | 2012-01-06 19:57

不行啊 还是抛异常 和以前一样

 

郭小宁 | 园豆:112 (初学一级) | 2012-01-09 09:18
其他回答(2)
0

为什么要return呢?这个返回值应该就是输入值吧。而且这里返回意味着在C++里面分配内存,在C#里使用,可能会有问题。

如果一定要return,可以用传引用值的方法,

比如  range(double [] x, ref double[] out);

收获园豆:15
五星 | 园豆:125 (初学一级) | 2012-01-08 00:20
0

用指针来写,很方便

  unsafe public static extern double* range(double* x);

调用的时候用fixed

这样:

  double[] ds= new double[18]; 

fixed (double* dd = ds)
                {

range(dd);

}

收获园豆:15
边城浪 | 园豆:264 (菜鸟二级) | 2012-01-10 19:34

大神不行啊  抛异常Attempted to read or write protected memory. This is often an indication that other memory is corrupt

支持(0) 反对(0) 郭小宁 | 园豆:112 (初学一级) | 2012-01-11 15:28

@郭小宁: 

是你这个C++函数本身有错误,不知道你想干什么!

支持(0) 反对(0) 边城浪 | 园豆:264 (菜鸟二级) | 2012-01-13 09:33

@郭小宁: 

写了个例子,可以说明的确是你C++函数有错:

http://files.cnblogs.com/yeerh/PCallTest.7z

支持(0) 反对(0) 边城浪 | 园豆:264 (菜鸟二级) | 2012-01-13 09:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册