C#.NET Q&A

C++dll 사용시 에러 linuxgo 평점: 없음 조회: 60
 
인녕하세요. C++ Dll 를 C#에서 사용하다 에러가 발생했는데 원인을 알수 없습니다.

 dll 파일은 센서업체에서 준 보정 관련 함수인데 import는 되는 것은 확인 했는데 C#에서 함수로 인자를 넘길때

 문제인지 계속 에러가 발생합니다.


  C++ 함수 원형은  아래와 같습니다.

   //Returns the version number of the dll
/////////////////////////////////////////////////////////////////////////////////////////
ILITEMATH_API double __stdcall GetILiteCalMathVersion();
 
 
 
ILITEMATH_API __int32 __stdcall CalculateCoefficients(INOUT __int32 coefficients[COEFFICIENT_COUNT],
OUT   __int32 *negCoeffs,
IN    __int32 numPoints,
IN    __int32 selCoeffs, //which coefficient to calibrate
IN    __int32 CalType,
IN    double *bridgeRaw,
IN    double *bridgeDesired,
#ifdef __cplusplus
IN    double *tempRaw = NULL,
IN    double *tempDesired = NULL);
#else
IN    double *tempRaw /*= NULL*/,
IN    double *tempDesired /*= NULL*/);
#endif
/*****************************************************************************
 *These functions convert from the output format of the software
 *to the internal format of the iLite chip for consistent units.
 *****************************************************************************/
//expects [-50, 150]
ILITEMATH_API double __stdcall ConvertFromDegrees(double tempInDegrees);
ILITEMATH_API double __stdcall ConvertFromDegreesEx(double tempInDegrees, double minTempInDegrees, double maxTempInDegrees); //new in version 1.210
ILITEMATH_API double __stdcall ConvertToDegrees(double tempInCodes); //new in version 1.210
ILITEMATH_API double __stdcall ConvertToDegreesEx(double tempInCodes, double minTempInDegrees, double maxTempInDegrees); //new in version 1.210
 
//expects 0, 100%
ILITEMATH_API double __stdcall ConvertFromPercent(double bridgeInPercent, bool raw);
//expects a number between [0,16383] for bridge, [0,2047] for temp

다음은 Dll 함수를 import 하여 C#로 테스트한 코드 입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
 
namespace Calib_test
{
    class Program
    {
        public  class index
        {
            public const int OFFSET_B = 0;
            public const int GAIN_B = 1;
            public const int TCG = 2;
            public const int TCO = 3;
            public const int SOT_TCO = 4;
            public const int SOT_TCG = 5;
            public const int SOT_B = 6;
            public const int OFFSET_T = 7;
            public const int GAINT_T = 8;
            public const int SOT_T = 9;
            public const int GAIN_8X = 10;
            public const int TSETL = 11;
        }
        public class flag
        {
            public const Int32 CO_OFFSET_B = 0x01;
            public const Int32 CO_GAIN_B = 0x02;
            public const Int32 CO_TCG = 0x04;
            public const Int32 CO_TCO = 0x08;
            public const Int32 CO_SOT_TCO = 0x10;
            public const Int32 CO_SOT_TCG = 0x20;
            public const Int32 CO_SOT_B = 0x40;
            public const Int32 CO_OFFSET_T = 0x80;
            public const Int32 CO_GAIN_T = 0x100;
            public const Int32 CO_SOT_T = 0x200;
        }
        public class caltype
        {
            public const Int32 CT_BR_PARABOIC = 0;
            public const Int32 CT_BR_S_SHAPED = 1;
        }
        [DllImport("iLiteCalMath.dll")]
        public static extern double GetILiteCalMathVersion();
        [DllImport("iLiteCalMath.dll")]
        public static extern double ConvertFromDegrees(double tempInDegrees);
        [DllImport("iLiteCalMath.dll")]
        public static extern double ConvertFromDegreesEx(double tempInDegrees,double minTempInDegrees, double maxTempInDegrees);
        [DllImport("iLiteCalMath.dll")]
        public static extern double ConvertFromPercent(double bridgeInPercent, bool raw);
        [DllImport("iLiteCalMath.dll")]
        public static extern double ConvertFromHex(double HexVal, bool raw, bool temp);
        [DllImport("iLiteCalMath.dll")]
        public static extern Int32 CalculateCoefficients(ref Int32[] coefficients, ref Int32 negCoeffs,
                     Int32 numPoints, Int32 selCoeffs, Int32 CalType, ref double[] bridgeRaw,
                       ref double[] bridgeDesired, ref double[] tempRaw, ref double[] tempDesired);
 
      
        static void Main(string[] args)
        {
            double[] rawB = new double[7] { 446, 12141, 527, 6108, 11465, 503, 10869 };
            double[] desiredB = new double[7] { 3000, 13000, 3000, 8000, 13000, 3000, 13000 };
            double[] rawT = new double[7] { 793, 793, 924, 924, 924, 1049, 1050 };
            double[] desiredT = new double[7];
            double[] temp = new double[7] { -6.33, -6.33, 23.4, 23.4, 23.4, 52.67, 52.7 };
            Int32[] coefficients = new int[12] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            Int32 cosForCal;
            Int32 negCoeffs = 0;
            Int32 numPoints;
 
            Int32 result;
            for (int i = 0; i < 7; i++)
            {
                desiredT[i] = ConvertFromDegreesEx(temp[i],-50,150);
                Console.WriteLine(desiredT[i]);
            }
            coefficients[index.TCG] = 0x1f;
            coefficients[index.OFFSET_B] = 1;
            numPoints = 7;
 
            cosForCal = flag.CO_OFFSET_B | flag.CO_GAIN_B | flag.CO_TCG | flag.CO_TCO |
                             flag.CO_SOT_TCO | flag.CO_SOT_TCG | flag.CO_SOT_B |
                             flag.CO_OFFSET_T | flag.CO_GAIN_T | flag.CO_SOT_T;
 
            result = CalculateCoefficients(ref coefficients, ref negCoeffs, numPoints, cosForCal, caltype.CT_BR_PARABOIC, ref rawB, ref desiredB, ref rawT, ref desiredT);
            if (result < 0)
            {
                Console.WriteLine("error");
            }
            else
            {
                for (int i = 0; i < 12; i++)   Console.WriteLine("{0}", coefficients[i]);         
            }
        }
    }
}

c++ dll 파일 함수 인자로 포인트로 넘기는 것이 많은데 혹시 C#에서 포인트 변환을 잘 못 했는지 CalculateCoefficients 계산부분에서 계속 컴파일 에러 발생합니다. 혹시 아시는 분 도움 요청드립니다.

태그 : C#질문
작성자 정보
linuxgo
Level 2
 [EXP.4/16]

메일:  비공개
글등록 +12 12 덧글등록 +3 0
자기소개
반갑습니다.
글 공유하기 |
  tweet facebook
2020-01-09 오전 11:02:45
나도한마디
태그로 엮인글
[C#.NET Q&A] 프린터 페이지 설정을 하고 싶습니다[2]+1 파일첨부 왕초보개발자
[C#.NET Q&A] TempData 관련 질문드립니다.   튼튼
[C#.NET Q&A] c# MDI 폼 질문드립니다  닉순
[C#.NET Q&A] devexpress schedulerControl에서 포커스된 appointment정보 가져올 수 있나요  판다3
[C#.NET Q&A] Dictionary 질문드립니다. 꼭 부탁드립니다.[3]  복싱가이
[C#.NET Q&A] C# WinForm끼리 데이터 주고받기[1]+2  shdid
[C#.NET Q&A] 엄청나게 많은 동일한 형식의 조건문을 효율적으로 쓰는 방법이 있을까요?[2]  진화가필요해
[C#.NET Q&A] c# 질문드립니다 (FTP 다운로드관련)  플라티너스
[C#.NET Q&A] label 텍스트 연속값 입력 문의[2]  프로그레스
[C#.NET Q&A] c#에서 만든 datatable을 mssql로 넘기고싶습니다..[4]  삔또
글리스트
c#zedgraph 파일첨부 ksj
C++ 2차 배열 마샬링 문의  울이
 ★현재글->   C++dll 사용시 에러  linuxgo
프린터 페이지 설정을 하고 싶습니다[2]+1 파일첨부 왕초보개발자
TempData 관련 질문드립니다.   튼튼
WinForm 관련 UI 문의 드립니다.   물속세상
singleton 으로 만들어진 클래스의 정적필드는 어떤역할인가요?[1]+2  질문
datagridview1의 정보를 받아 행열 변환 상태로 datagridview 구현 파일첨부 하리
c# MDI 폼 질문드립니다  닉순
devexpress schedulerControl에서 포커스된 appointment정보 가져올 수 있나요  판다3
포인터가 포함된 함수를 C#으로 변환할 수 있는지요?[1] 파일첨부 고무랭이
클래스 간 효과적인 Event handler 사용 방법 문의[1] 파일첨부 고무랭이
트랜잭션 내에서 다른 트랜잭션 처리가 가능할까요??[1]+1  자크