2014-03-03 3 views
0

외장 DLL 방법이있다 : 출력, 처리하는 *의 INT와 * 더블 방법을 묻는대로 나는 C#에서 매개 변수를 전달할 수있는 방법패스 올바른 매개 변수

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) 

은 ?

예제 코드에서는 메서드에서 필요로 할 때 매개 변수를 전달할 수 없습니다. 뭐가 잘못 됐어? 내가 잘못 뭐하는 거지

enter image description here

 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); 

으로 노력했지만 그들은 를 작동하지 않는

답변

1

이 (적어도 컴파일) 나를 위해 일한 :

더블 []를 전달하려면 내가 다른 매개 변수를 전달하고 있지 않다

int key = 100; 
    int* keyPointer = (int*)&key; 
    bvlsFortran.BV(keyPointer); 

, 당신은 스스로 그것을 할 수있어 fixed 키워드를 사용해야합니다.

double[] a = {1.0, 2.0, 3.0, 4.0, 5.0}; 
    fixed (double* pt = a) 
    { 
     bvlsFortran.BV(pt); 
    } 

[In], [Out] 속성 : refout과 다른 것입니다. 원하는 경우 msdn에서 OutAttributeInAttribute에 대한 자세한 내용을 볼 수 있습니다.

당신이 시도 할 수있는 또 다른 옵션은 관리되지 않는 DLL에 대한 C++/CLI 래퍼를 작성하고 포인터 및 기타 안전하지 않은 코드를 사용할 필요없이 C#에서 사용하는 것입니다.

+0

마샬을 사용하여 안전한 상황에서 사용할 수 있습니까? – cMinor

+0

@cMinor C++/CLI 래퍼를 사용하기 위해 C#에서 안전하지 않은 코드 사용을 피하는 유일한 방법 – Uriil

+0

이중 * []로이 기술을 어떻게 적용합니까? 이중으로 * aP = (double *) &a ...;이 작동하지 않습니다 – cMinor