안녕하세요.
.net에서 native c++을 사용해야합니다.
질문이 두가지입니다.
우선 첫번째는..
여러가지 방법을 찾아보다가 해당 업체에서 제공해주는게 dll뿐이라서
c++/cli로 wrap하는 방법은 안되는것같더군요 ㅠㅠ lib파일이 있어야 한다는것 같던데..
c++/cli로 wrap할때 dll하고 header파일만 제공해줄경우에는 어떻게 해야하나요?
두번째 질문은 위 방법이 안되는거같아서 DllImport를 사용하고있습니다.
위와 같은 코드를 테스트 중입니다.
(프로젝트와 header파일은 별도로 첨부하겠습니다. c++ dll은 bin/Debug에 있습니다.)
static void Main(string[] args)
{
long session = 0;
int result = -1;
try
{
result = EA_CreateSession(ref session, "localhost", 7005);
Console.WriteLine(result);
EA_DEVICE_INFO[] devList = new EA_DEVICE_INFO[200];
int devCount = 0;
IntPtr devCnt = IntPtr.Zero;
result = EA_GetDeviceList(session, true, devList, ref devCount);
Console.WriteLine(result);
result = EA_GetDeviceList(session, true, devList, devCnt);
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
result = EA_DeleteSession(ref session);
Console.WriteLine(result);
}
Console.ReadLine();
}
//EA_API int __stdcall EA_GetDeviceList(EA_CONTEXT session, bool bAll, EA_DEVICE_INFO* devList, int* devCount);
[DllImport("EA.dll")]
public static extern int EA_GetDeviceList(long session, bool bAll, [In, Out]EA_DEVICE_INFO[] devList, ref int devCount);
[DllImport("EA.dll")]
public static extern int EA_GetDeviceList(long session, bool bAll, [In, Out]EA_DEVICE_INFO[] devList, IntPtr devCount);
//EA_API int __stdcall EA_CreateSession(EA_CONTEXT* session, const char* host, const int port);
[DllImport("EA.dll")]
public static extern int EA_CreateSession(ref long session, string host, int port);
//EA_API int __stdcall EA_DeleteSession(EA_CONTEXT* session);
[DllImport("EA.dll")]
public static extern int EA_DeleteSession(ref long session);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct EA_DEVICE_INFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public StringBuilder ID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public StringBuilder NAME;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public StringBuilder IP;
}
여기에서 EA_GetDeviceList 를 호출할때 에러가 발생합니다.
여러 문서들과 정성태님께서 작성하신 포스트 및 질문답변도 모두 찾아보고 이것저것 해봤지만 안되네요 ㅠㅠ
EA_DEVICE_INFO를 class로 해보기도하고 StringBuilder대신 string을 사용하기도하고
StructLayout, MarshalAs등도 바꿔보고 안전하지않은 코드허용, 32비트 기본사용 등등도 바꿔보고
이것저것 해봤지만 c++과 마샬링에대한 지식이 없어서인지 잘안되네요 ㅠㅠ
작성하신 글중에 int* 를 호출하는 방법에 대해서 찾아보고 해당 부분을 바꿔보기도하고
여러가지 테스트했다고 생각하는데 방법을 모르겠습니다. ㅠㅠ
도움 주시면 감사하겠습니다.
ex : 실제로 서버 주소가 필요한 dll이기 때문에 작동하지 않거나 잘못된 result값을 반환할 것입니다.
[최초 등록일: ]
[최종 수정일: 7/10/2018]