2012-07-24 2 views
2

PInvoke Interop Assistant를 사용하여 C# PInvoke 서명을 생성했습니다. 나는 이것에 대한 확인을 원합니다. DLL을 호출 할 때 "PInvoke DLL을 찾을 수 없습니다"라는 메시지가 나타납니다. 함수를 내보내고 있습니다. DLL은 실행 파일과 함께 제공됩니다. 메시지와 암호문은 미가공 바이트의 입/출력 블롭이며 동일한 버퍼입니다.이 C 함수의 올바른 C# PInvoke 서명

/// Return Type: int 
    ///message: UINT8* 
    ///ciphertext: UINT8* 
    ///msglength: UINT64->unsigned __int64 
    [DllImport("HC128.dll", EntryPoint = "EncryptDeviceName")] 
    public static extern int EncryptDeviceName(System.IntPtr message, System.IntPtr  ciphertext, ulong msglength); 

나는 다음과 같은 similar question의 제안을 따라 업데이 트를 제공합니다 :

extern "C" int __declspec(dllexport) EncryptDeviceName(uint8 *message, uint8 *ciphertext, uint64 msglength) 
{ 
    ... 

    return 0; 
} 

그것은 다음과 같은 C#의 PInvoke 시그니처를 생성합니다.

UPDATE

내 서명은 정렬 화 ALLOC/할당 해제와 윈도우 CE 6 작업을 수행합니다. Tergiver의 서명은 Windows CE 6에서도 작동하며 마샬링 alloc/dealloc을 필요로하지 않습니다.

+0

이러한 링크를 확인하셨습니까? http://msdn.microsoft.com/en-us/library/sd10k43k.aspx http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/4da372f4-9602-4df5-9585- 8816ad0770cf – SOReader

답변

0

p/Invoke 선언을 작성하는 방법은 여러 가지가 있습니다. 주어진 명령은 작업 할 수 있지만, Marshaller의 작업 (관리되지 않는 메모리 할당, 복사 및 문자 인코딩 변환 수행)을 수행해야합니다.

네이티브 선언은 필수 마샬링시 추측 할 수있는 충분한 정보를 제공하지 않으므로 아마도 거기에없는 것입니다.

네이티브 기능에서 기대하는 문자 인코딩은 message입니까? ciphertext은 원시 바이트의 한 묶음입니까? 아니면 문자 인코딩 (안과 밖 모두)을 가지고 있습니까? 모두 messagecipherText 원시 바이트 배열 인 경우

업데이트, 우리는 그들을

[DllImport("HC128.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "EncryptDeviceName")] 
public static extern int EncryptDeviceName([In] byte[] message, [In, Out] byte[] ciphertext, ulong msglength); 

In[Attribute]Out[Attribute] 사본을 수행 할 수있는 방법 마샬에게로 정렬 화 얻을 수 있습니다. [In, Out]이 기본값이며, 나는 명백하게하고 싶다.

+0

메시지 및 암호문이 원시 바이트 BLOB입니다. –

+0

@ PeterArandorenko 업데이트 됨 – Tergiver

+0

업데이트 : 내 서명은 Windows CE 6에서 마샬링 된 alloc/dealloc을 사용하여 작동합니다. 또한 서명이 잘 작동합니다. 그러나, 마샬 한 alloc/dealloc 여전히 서명 필요합니까? –

2

CallingConvention.Cdecl이 누락되었습니다. 또는 C면에서 __stdcall을 사용하십시오.