我是C#的新手(在上周才开始学习)。

我有一个用C编写的具有以下功能的自定义DLL:

DLLIMPORT void test_function (double **test)


我想要做的是从C#获得一个指向数组“测试”的指针。

因此,如果在DLL函数中我具有test [0] = 450.60,test [1] = 512.99等。我希望能够在我的C#程序中使用它。

在C#程序中,我类似于:

namespace TestUtil
{
  public class Echo
  {
    public double[] results = new double[10];
    public double[] results_cpy = new double[10];


    [DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern unsafe void test_function(ref double[] Result);

    public unsafe void Tell()
    {
      results[0] = 0.0;
      results[1] = 0.0;

      results_cpy[0] = 0.0;
      results_cpy[1] = 0.0;

      test_function(ref results);
      results_cpy[0] = (double)results[0] + (double)results[1] ;
    }
  }
}


在DLL的“ test_function”函数中,我使用了以下命令:

*test[0] = 450.60;
*test[1] = 512.99;


在DLL中,一切正常(我在DLL中使用一个消息框来检查所应用的值)。回到C#程序中,“ results [0]”似乎很好,我可以从中获取值,但是“ results [1]”为我提供了超出范围错误的索引。我知道这是因为,如果我省略'+(double)results [1]',我不会收到任何错误。另外,如果我没有尝试在DLL中修改“ test [1]”,它将保留来自C#的原始值(在我的示例中为0.0)。

显然,我没有做正确的事情,但这是我能够使它完全起作用的最接近方法。我尝试过的所有其他操作都失败了。

任何帮助将不胜感激。

最佳答案

不需要不安全的代码。实际上,根本不需要通过引用。如果您的签名如下所示:

void test_function (double *test)


您的导入看起来像这样:

static extern void test_function(double[] Result);


然后,一切应该正常。也就是说,假设您只需要修改数组而不返回一个全新的数组。

10-07 19:16
查看更多