2010-02-04 2 views
2

C# 프로젝트에서 C++로 작성된 DLL을 사용하고 있습니다. 이 코드를 사용하여 DLL 내에서 함수를 호출 할 수있게되었습니다.C#으로 작성된 DLL에서 사용자 정의 유형 호출하기 #

[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
     public static extern IntPtr VmHidScan(); 

이제 사용자 지정 형식 포인터를 요구하는 함수를 호출해야합니다. DLL 레이아웃에 대한 문서 도구는 다음과 같습니다.

hid_get_info(int n,PDEV_INFO *pdi) 

이 사용자 정의 포인터를 사용하는 방법을 모르겠습니다. 이 DLL에 정의되어 있습니까? 그렇다면 어떻게 C# 프로젝트에서 사용할 수 있습니까? 그렇지 않다면 헤더 파일을 C#에 포함시켜야합니까? 귀하의 도움에 미리 감사드립니다.

답변

4

, 그것은 보인다. 이 구조의 선언을 찾아 [StructLayout] 특성을 사용하여 C# 코드에 추가해야합니다.

[DllImport("blah.dll")] 
private static extern something hid_get_info(int n, out IntPtr pdi); 

및 구조 값을 얻기 위해() Marshal.PtrToStructure를 사용 그런 다음 C# 코드에서이 같은 함수를 선언 것입니다. 다행히도 구조를 자유롭게 할 필요가 없으면 망쳐 버릴 것입니다.

두 번째 해석은 "pid"가 DEV_INFO 구조체에 대한 포인터의 배열을 반환한다는 것입니다. 다소 "n"인자가 주어진다면, 함수에 의해 채워질 배열의 원소의 수를 의미 할 수 있습니다. 이 경우 IntPtr []을 전달하고 길이에 "n"을 설정하십시오.

+1

@rros - 궁금한데, 어떤 해석이 맞습니까? –

0

C++에서 PDEV_INFOstruct을 반영하는 C#에서 struct을 생성해야합니다.

구조체에 [StructLayout(LayoutKind.Sequential)]을 적용한 다음 C++ 구조체의 필드 (헤더 파일)를 순서대로 복사해야합니다.

그런 다음 structref 매개 변수로 사용하는 extern 메서드를 작성할 수 있습니다.

0

나는 안전하게 PDEV_INFO*DEV_INFO**이라고 가정합니다. C#에서

사용이 : 진짜 선언 DEV_INFO는 구조입니다

hid_get_info(int n, DEV_INFO **pdi) 

입니다처럼 "P"접두어를 감안할 때

class DEV_INFO 
{ 
    // fields go here 
} 

static class NativeMethods 
{ 
    [DllImport...] 
    public static extern int hid_get_info(int n, ref DEV_INFO pdi); 
} 
+0

** DEV_INFO가 아닌 * DEV_INFO입니다. –

+0

@nobugz :'DEV_INFO'가 C#에서 * 클래스 *로 선언 될 때 아닙니다. –

+0

아 맞아. [StructLayout]은 클래스에서 선택 사항이 아닙니다. –

관련 문제