안녕하세요. 프로그램징어 입니다. 며칠째 검색해보고 했는데 계속 잘 안되는 부분이 있어서
프게 고수분들께 질문드려 봅니다.ㅠ
먼저 아래와 같이 C코드가 있습니다.
c코드
======================================
cTest.h
======================================
#ifndef BOOL
#define BOOL int
#endif
// 구조체1
typedef struct Struct1{
int iVal;
double dVal;
double dArray[50];
BOOL boolVal;
}Struct1;
// 구조체2
typedef struct UseStruct{
int iUseVal;
double dUseVal;
Struct1 s1; // 구조체1
}UseStruct;
// 구조체3
typedef struct Result{
int iResultVal;
double dResult;
}Result;
======================================
======================================
cTest.c
======================================
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <exception>
#include <iostream>
#include <fstream>
#include "cTest.c"
#pragma comment (lib, "cTest.lib")
#define EXPORTDLL extern "C" __declspec(dllexport)
EXPORTDLL Result linkResultDLL(Struct1 s1, Result r1);
EXPORTDLL void ShowSummary();
EXPORTDLL public Result linkResultDLL(Struct1 s1, Result r1);
{
// 작업~~~~~~
}
======================================
현재 C코드는 이렇게 되어있고
저 코드를 C#에서 호출하려고 하는데
당췌 구조체 마샬리을 어떻게 해야할지 모르겠네요.
마샬링 없이 그냥 c# 데이터 타입으로 넘겨 버리면 C에서 받아서 구조체1 데이터에 접근해보면
이상한 값들로 가득차있습니다.
저 C소스의 linkResultDLL 함수에 받은 값들을 txt파일로 출력하는 부분을 넣어뒀는데 입력된 값을 보면
UseStruct.s1.iVal : -150704643
UseStruct.s1.dVal : 111930792
UseStruct.s1.dArray : 7.41085e+265 2.00006e+193 5.53004e-316 1.57496e-276 2.122e-314..........
UseStruct.s1.boolVal : 111928784
뭐 이런 쓰레기 값들로 가득차 있습니다.
그래서 마샬링으로 해야 한다고 해서 검색해서 해봤는데.
C#에서 구조체를 아래처럼 정의 하고
[DllImport("cTest.dll")]
public static extern Result linkResultDLL(Struct1 s1, Result r1);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Struct1
{
public int iVal;
public double dVal;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 400)]
public double[] dArray;
public int boolVal;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct UseStruct
{
public int iUseVal;
public double dUseVal;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 416)]
public Struct1 s1; // 구조체1
}
이런식으로 정의 했고
아래처럼 링크된 DLL의 함수를 호출 하였습니다.
Struct1 s1 = new Struct1();
Result r1 = new Result();
Result r2 = new Result();
IntPtr res = Marshal.AllocHGlobal(Marshal.SizeOf(s1));
Marshal.StructureToPtr(s1, res, false);
r2 = linkResultDLL(s1, r1);
뭐 이런식으로 해보려했는데 계속
IntPtr res = Marshal.AllocHGlobal(Marshal.SizeOf(s1));
이부분에서 " 'Struct1'형식은 관리되지 않는 구조체로 마샬링할 수 없으므로 의미 있는 크기 또는 오프셋을 계산할 수 없습니다." 라고 나오네요.
아무래도 구조체 마샬링 자체를 잘못한거 같은데 어떻게 해야하는지 아시는 방법좀 알려주세요!!
이거때문에 며칠째 고생이네요. 그럼 부탁드립니다ㅠ