2014-06-16 3 views
0

C#에서 C 구조체를 호출하려고 시도했지만 작동하지 못했습니다. C에서 정의 내 구조체는 다음과 같다 :C#에서 C? dll을 호출하는 방법은 무엇입니까?

struct GHX{ 
    double output[28]; 
    int val; 
}; 

내가 출력을 계산하는 데 사용하고 함수 C#에서

__declspec(dllexport) void GHXfunction(
    double *XIN, double *parameter, 
    int mode, int hour, GHX *result) 
{ 
    /*...*/ 
} 

, 가 나는 다음과 같은 방법을 시도했다.

[StructLayout(LayoutKind.Sequential)] 
public struct GHX 
{ 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 28)] 
    public double[] output; 
    public int val; 
} 
[DllImport("GHXDLL.dll", EntryPoint = "GHXfunction", 
    CallingConvention = CallingConvention.Cdecl)] 
public static extern void GHXfunction(
    IntPtr XIN, IntPtr parameter, int mode, 
    int hour , ref GHX result); 

지금까지 나는 stackoverflow에서 온 누군가가 나와 같은 문제를 가지고 있기 때문에 모든 것이 괜찮다고 믿습니다. 그러면 간단한 시나리오를 다음과 같이 테스트합니다. 이 저까지 다음

static void Main() 
{ 
    IntPtr XIN= IntPtr.Zero; 
    IntPtr Par=IntPtr.Zero; 
    int mode=1; 
    int hour=0; 
    GHX test = new GHX(); 
    GHXfunction(XIN, Par, mode, hour, ref test); 
} 

그것을 "보호 된 메모리를 읽거나 쓰려고했습니다.이 종종 다른 메모리가 손상되었음을 나타냅니다."

누구나 그것에 대해 알고 있습니까? 감사합니다. .

편집, 실제로 어떻게 IntPtr이 작동하는지 모르겠습니다. 그래서 IntPtr.Zero가 0으로 메모리 위치를 반환 할 것이라고 추측했습니다. 아마도 틀 렸습니다. 내 원래의 C 코드에서

은 내가 포인터 입력을 C#에서 함수를 호출하는 방법을 잘 모릅니다이

double par[42], xin[5]; 
ptrxin = &xin[0]; 
ptrpara = &par[0]; 
struct GHX result; 
GHXfunction(ptrxin, ptrpara, 0, 0,result); 

같은 함수를 호출합니다. 감사합니다. .

근무 코드 : Ben의 제안에 기반 해 작성. C#에서 구조체를 호출 할 수 있습니다. double*

[StructLayout(LayoutKind.Sequential)] 
    public struct GHX 
    { 
     [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 28)] 
     public double[] output; 
     public int val; 
    } 


    [DllImport("GHXDLL.dll", EntryPoint = "GHXfunction", CallingConvention = CallingConvention.Cdecl)] 
    public static extern void GHXfunction(double[] XIN, double[] parameter, int mode, int hour,ref GHX result); 


    static void Main() 
    { 
     double result; 
     double[] XIN= new double[5]; 
     double[] Par = new double[42]; 
     int mode = 1; 
     int hour=0; 
     GHX test = new GHX(); 
     GHXfunction(XIN, Par, mode, hour,ref test); 
     result = test.output[0]; 

    } 
+3

* IntPtr.Zero *를 * XIN * 및 * Par *에 전달할 수 있습니까? –

+0

확실하지 않습니다! 나는 IntPtr이 C#에서 어떻게 작동하는지 모른다. ~~~ – user3745869

답변

1

AC 유형으로 번역해야 하나

ref double 

또는

double[] 

의견이 그들이다 배열 말 이후, 시도 :

[DllImport("GHXDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern void GHXfunction(double[] XIN, double[] parameter, int mode, 
             int hour , ref GHX result); 

P/호출이 처리됩니다. f 배열을 고정하고 첫 번째 요소의 주소를 전달합니다.

+0

고마워 ~하지만 내 C 코드에서, 나는이 XIN을 'double par [42]'처럼 읽는다. for (i = 0; i <42; i ++) \t { \t \t 파라미터 [i] = * par; \t \t par ++; \t}'. 그것은 당신의 방법에 효과가 있습니까? – user3745869

+0

@ user3745869 : 그것은 합법적이지 않습니다. C 배열 이름을 지정할 수 없습니다. 어쨌든, 당신이 질문에 보여 주신 것은 첫 번째 요소의 주소를 전달하는 것입니다. 정확히 C#이 보여줄 것입니다. –

+0

Ben, 고마워, 네가 맞아. 이제 작동합니다. 고맙습니다 ~~~이 코드를 작성할 때 나는 C의 초보자이며 불과 3 개월 전입니다. 나는 코드가 오싹 해 보인다는 것을 알았지 만 작동한다. – user3745869

관련 문제