我对 C# 非常陌生(上周才开始学习)。
我有一个用 C 编写的自定义 DLL,具有以下函数:
DLLIMPORT void test_function (double **test)
我想要做的是从 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] ;
}
}
}
在 DLL 的“test_function”函数中,我使用了以下内容:
*test[0] = 450.60;
*test[1] = 512.99;
在 DLL 中,一切正常(我使用 DLL 中的消息框来检查是否应用了值)。回到 C# 程序,“结果[0]”似乎没问题,我可以从中获取值,但“结果[1]”给我一个索引越界错误。我知道这一点是因为如果我省略 '+ (double)results[1]' 我不会收到错误。另外,如果我没有在 DLL 中尝试修改“test[1]”,它会保留 C# 的原始值(在我的示例中为 0.0)。
显然我没有做正确的事情,但这是我能够让它发挥作用的最接近的结果。我尝试过的其他一切都惨遭失败。
任何帮助将不胜感激。
不需要不安全的代码。事实上,根本不需要通过引用传递。如果您的签名如下所示:
void test_function (double *test)
你的导入看起来像这样:
static extern void test_function(double[] Result);
那么一切都应该工作正常。也就是说,假设您只需要修改数组而不返回一个全新的数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)