在C#中使用C DLL和C DLL中的数组和指针

1 c# arrays double dll pointers

我是C#的新手(过去一周才开始学习).

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

DLLIMPORT void test_function (double **test)
Run Code Online (Sandbox Code Playgroud)

我想要做的是从C#获得一个指针,用于数组'test'.

所以,如果在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] ;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在DLL的'test_function'函数中,我使用了以下内容:

*test[0] = 450.60;
*test[1] = 512.99;
Run Code Online (Sandbox Code Playgroud)

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

显然我没有做正确的事情,但这是我能够完全开始工作的最接近的事情.我尝试过的其他一切都失败了.

任何帮助将不胜感激.

Sim*_*ead 5

不需要不安全的代码.事实上,根本没有必要通过引用.如果您的签名如下所示:

void test_function (double *test)
Run Code Online (Sandbox Code Playgroud)

你的导入如下:

static extern void test_function(double[] Result);
Run Code Online (Sandbox Code Playgroud)

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