Я реализовал некоторые функции в программе на C и заключил их в dll, которая будет вызываться в другом проекте на C #.Одна из функций в dll принимает указатель функции в качестве входного аргумента, то есть в исходном коде, генерирующем dll, одна из функций выглядит следующим образом:
void functionA(
int* a,
int* b,
double *c,
double[] inputArr,
double[] outputtArr,
void(*fun)(int*, int*,double[],double[])
)
Внутри функции A inputArr будет иметь видиспользуется в качестве входных данных для указателя на функцию, а outputArr будет использоваться в качестве выходных данных.Параметр inputArr должен иметь размерность * a, а размер outputtArr должен быть * b.
. В C # я попытался импортировать dll и вызвать функцию A следующим образом:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Test{
class Program
{
public delegate void costfun(ref int a, ref int b, double[] x, double[] fx);
static void Main(string[] args)
{
int a = 5, b = 3,
double c= 1e-14
double[] x = new double[5] { 1, 3, 5, 7, 9 };
double[] y= new double[3] { 100, 100, 100 };
costfun F = new costfun(fun);
functionA(ref a, ref b, ref c, x,y Marshal.GetFunctionPointerForDelegate(F));
}
public static void fun(ref int na, ref int nb, double[] inX, double[] outY)
{
int i = 0;
outY= new double[nb];
if (outY.Length != nb)
{
//Console.WriteLine("output incorrect");
return;
}
if (inX.Length != na)
{
// Console.WriteLine("input incorrect");
return;
}
for (i = 0; i < nb; i++)
{ outY[i] = inX[i] * inX[i + 1] + 1; }
}
// import the dll
[DllImport("cdll.dll", EntryPoint = "functionA", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void functionA(int* a, int* b, double*c,double[] inputArr, double[] outputtArr, IntPtr fcpointer);
}
}
Программа успешно скомпилирована и может быть выполнена.все же я обнаружил, что во время выполнения всякий раз, когда функция fun вызывается из dll, входной массив inX имеет только один элемент, то есть передается только inX [0].Если я прокомментирую два оператора if внутри функции fun, Visual Studio прекратит работу из-за исключения исключения индекса из оператора:
outY[i] = inX[i] * inX[i + 1] + 1;
из-за inX [i + 1]. Может кто-нибудь датьмне несколько советов, как решить эту проблему?Спасибо