1

我对 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)。

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

任何帮助将不胜感激。

4

3 回答 3

5

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

void test_function (double *test)

你的导入看起来像这样:

static extern void test_function(double[] Result);

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

于 2009-04-12T03:34:37.183 回答
1

我猜你已经知道 C++;如果是这种情况,您真的应该看看 C++/CLI,它可以让您轻松使用 C++ 中的托管代码 (.NET)。您上面显示的代码确实不是很像 C#(您应该完全避免使用unsafe)。

于 2009-04-12T03:11:56.223 回答
0

关于 SO here的类似问题。您正在查看一个不透明的指针,因此它很可能是另一个线程中描述的按引用系统 InPtr。

顺便说一句,为什么不让它成为双 * 而不是双**。我想这会让生活更轻松。

于 2009-04-12T03:33:13.067 回答