2017-09-22 1 views
0

Delphi2006으로 만든 dll에서 다음 내보내기를했습니다.int 배열을 C#에서 델파이로 마샬링하는 방법

TLongIntArray = array of LongInt; 

및 TStatusType 그냥 열거입니다 :

TStatusType = (stPhysical, stMaster); 

지금 나는 C# 응용 프로그램에서이 메소드를 호출하려고 TLongIntArray는 다음과 같이 정의된다

procedure ScSetMRStatus(StatusType: TStatusType; active_mr_ids: TLongIntArray; id_dst: Integer; id_src_list: TLongIntArray; IsComplete: Boolean); stdcall; export; 

.

의 C#에서이 방법을 사용하여
[DllImport(DelphiDLLName, EntryPoint = "ScSetMRStatus", CallingConvention = CallingConvention.StdCall)] 
private static extern void ScSetMRStatus(
    Int32 statusType, 
    IntPtr activeMrIds, 
    Int32 IdDst, 
    IntPtr idSrcList, 
    [MarshalAs(UnmanagedType.U1)] bool isComplete); 

:

ScSetMRStatus((Int32) statusType, ConvertManagedArrayToDelphiDynIntArray(activeMrIds), idDst, ConvertManagedArrayToDelphiDynIntArray(idSrcList), isComplete); 

ConvertManagedArrayToDelpiDynIntArray 보이는 같은 :

public static IntPtr ConvertManagedArrayToDelphiDynIntArray(int[] array) 
{ 
    if (array == null) return IntPtr.Zero; 

    int elementSize = sizeof(int); 
    int arrayLength = array.Length; 
    int allocatedMemSize = 8 + elementSize * arrayLength; 
    IntPtr delphiArrayPtr = Marshal.AllocHGlobal(allocatedMemSize); 
    Marshal.WriteInt32(delphiArrayPtr, 0, 1); 
    Marshal.WriteInt32(delphiArrayPtr, 4, arrayLength); 
    for (int k = 0; k < arrayLength; k++) { 
     Marshal.WriteInt32(delphiArrayPtr, 8 + k*elementSize, array[k]); 
    } 
    return delphiArrayPtr+8; 
} 

그러나이 작동하지 않습니다!

델파이로 C# 배열을 보내려면 어떻게해야합니까?

답변

1

마침내 작동 중입니다.

할당 된 메모리를 해제하기 위해 호출과 관련하여 몇 가지 변경을했습니다.

var activeMrIdsNative = ConvertManagedArrayToDelphiDynIntArray(activeMrIds); 
var idSrcListNative = ConvertManagedArrayToDelphiDynIntArray(idSrcList); 
ScSetMRStatus((Int32) statusType, activeMrIdsNative, idDst, idSrcListNative, isComplete); 
Marshal.FreeHGlobal(activeMrIdsNative-8); 
Marshal.FreeHGlobal(idSrcListNative-8); 

우리는 단지 우리가 델파이 측이 그것으로 무엇을 바라 보았다하지 않은대로 작동하지 않을 거라 생각 했어요. 모든 데이터가 델파이 dll에 들어갑니다.

아마도 메모리 문제가있을 수 있지만이를 검토 할 것입니다.

관련 문제