有一个外部dll方法:
public unsafe static void BV([In] int* key, [In] int* m, [In] int* n, [In] double* a, [In] double* b, [In] double* bl, [In] double* bu, [Out] double* x, [Out] double* w, [In] double* act, [In] double* zz, [Out] double* istate, [Out] int* loopa)
如何在c#中传递参数,因为要求* int和* double以及如何处理in,out?
在示例代码中,我无法传递参数,因为方法需要它们。这有什么不对?
int key = 0, n = 2, m = 3;
double[] a = { 1.0, 2.0, 3.0, 4.0, 5.0 };
double[] b = { 10.0, 20.0, 30.0 };
double[] bl = { 0.0, 1.0 };
double[] bu = { 1.0, 2.0 };
double[] x = new double[n];
double[] w = new double[n];
double[] act = new double[m * (Math.Min(m, n) + 2)];
double[] zz = new double[m];
double[] istate = new double[n + 1];
int loopA = 0;
bvlsFortran.BV(key,m,n,a,b,bl,bu, x,w,act,zz,istate,loopA ); //bvlsFortran is dll file
Console.WriteLine(loopA);
我正在尝试
bvlsFortran.BV(key,m,n,a,b,bl,bu, out x,out w,act,zz,out istate, out loopA );
以及
bvlsFortran.BV(ref key,ref m,ref n,ref a,ref b,bl,bu, out x,out w,act,zz,out istate, out loopA );
但它们似乎不起作用 我做错了什么
答案 0 :(得分:1)
我认为您应该使用IntPtr结构将整数和双指针传递给DLL方法。
http://msdn.microsoft.com/en-us/library/system.intptr%28v=vs.110%29.aspx
另请看这个表。它是特定于从C#调用COM / DCOM组件的情况,但它也会给你一个想法。
http://msdn.microsoft.com/en-us/library/sak564ww%28v=vs.110%29.aspx
答案 1 :(得分:1)
这对我有用(至少它编译):
int key = 100;
int* keyPointer = (int*)&key;
bvlsFortran.BV(keyPointer);
我没有传递其他参数,你可以自己动手
要传递double [],您应该使用fixed
关键字:
double[] a = {1.0, 2.0, 3.0, 4.0, 5.0};
fixed (double* pt = a)
{
bvlsFortran.BV(pt);
}
[In]
,[Out]
属性:它与ref
和out
不同。如果您愿意,可以在msdn。
您可以尝试的另一个选项是为非托管dll编写C ++ / CLI包装器,并从c#中使用它,而无需使用指针和其他不安全的代码。