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];
}
* IntPtr.Zero *를 * XIN * 및 * Par *에 전달할 수 있습니까? –
확실하지 않습니다! 나는 IntPtr이 C#에서 어떻게 작동하는지 모른다. ~~~ – user3745869