게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c#에서 c++ DLL 연결시 구조체 파라미터 전달시 마샬링 관련 질문
게시물ID : programmer_5257짧은주소 복사하기
작성자 : 넉우리
추천 : 0
조회수 : 14928회
댓글수 : 9개
등록시간 : 2014/09/02 14:37:39
옵션
  • 본인삭제금지
안녕하세요. 프로그램징어 입니다. 며칠째 검색해보고 했는데 계속 잘 안되는 부분이 있어서
프게 고수분들께 질문드려 봅니다.ㅠ
 
먼저 아래와 같이 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'형식은 관리되지 않는 구조체로 마샬링할 수 없으므로 의미 있는 크기 또는 오프셋을 계산할 수 없습니다." 라고 나오네요.

아무래도 구조체 마샬링 자체를 잘못한거 같은데 어떻게 해야하는지 아시는 방법좀 알려주세요!!

이거때문에 며칠째 고생이네요. 그럼 부탁드립니다ㅠ

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호