문제

C ++ DLL에 내보내는 기능이 있습니다.

// C++ DLL (Blarggg.dll)

extern "C"
{
     USHORT ReadProperty( BYTE * messsage, USHORT length, BYTE * invokeID ) 
    {
         if( invokeID != NULL ) {
            * invokeID = 10 ; 
        }
         return 0;
    }
}

C# 응용 프로그램에서 사용할 수 있도록하고 싶습니다.

// C# app 
[DllImport("Blarggg.dll")]
public static extern System.UInt16 ReadProperty(
        /* [OUT] */ System.Byte[] message,
        /* [IN]  */ System.UInt16 length,
        /* [OUT] */ System.Byte[] invokeID ); 


private void DoIt() 
{
    System.Byte[] message = new System.Byte[2000];
    System.Byte[] InvokeID = new System.Byte[1];
    System.UInt16 ret = ReadProperty( message, 2000, InvokeID ); // Error 
}

문제는 다음 오류 메시지를 계속 받는다는 것입니다.

'System.nullReferenceException'유형의 예외는 blarggg.dll에서 발생했습니다. 추가 정보 : 개체 참조 객체의 인스턴스로 설정되지 않았습니다.

VS2008을 사용하여 DLL과 C# 응용 프로그램을 모두 구축하고 있습니다.

나는 C# 프로그래머가 아닙니다.

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

코드를 VS2008로 직접 붙여 넣었고 32 비트 컴퓨터에서 완벽하게 실행됩니다 (내보낸 이름을 설정하기 위해 .def 파일을 추가). C ++ 라이브러리가 확실히 순수한 Win32 프로젝트입니까? 당신이 준 오류 메시지는 그것이 CLR 예외를 던 졌다는 것을 암시하는 것 같습니다.

다른 팁

이 시도:

[DllImport("Blarggg.dll", CallingConvention := CallingConvention.Cdecl)] 
public static extern System.UInt16 ReadProperty( 
        /* [IN]  */ System.Byte[] message, 
        /* [IN]  */ System.UInt16 length, 
        /* [OUT] */ out System.Byte invokeID );  


private void DoIt()  
{ 
    System.Byte[] message = new System.Byte[2000]; 
    System.Byte InvokeID; 
    System.UInt16 ret = ReadProperty( message, 2000, out InvokeID );
} 

사용해야 할 수도 있습니다 System.runtime.interopservices.marshal 클래스 관리되는 유형과 관리되지 않는 유형 사이를 변환합니다.

C ++ 유형으로 이것을 할 수 있습니까?

나는 당신이 c dlls 만 dlimport 만 할 수 있다는 인상을 받았습니다.

우리는 C ++ DLL과 함께 dllimport를 사용하지만 외부 기능을 다음과 같이 선언합니다.

extern "C" __declspec(dllexport) ...

이 웹 페이지를 살펴보십시오.

http://dotnetperls.com/dllimport-interop

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top