나는 delphy pascal 프로젝트에서 사용되는 C++ dll을 가지고 있으며 이것을 사용하기 위해 C# 프로젝트를 만들고 싶습니다. dll은 인터페이스 객체를 반환하고 dllImport가 인식 할 수 있도록 C# 인터페이스를 구현하는 방법에 대해 지금 당황하고 있습니다. 파스칼로 된 코드를 가지고 있습니다. 또한, 나는 DLL의 C++ 소스에 액세스 할 수 없습니다. 여기 파스칼에서 C로 코드 변환
는 delphy의 일부입니다interface
uses
IdGlobal;
type
// TIdBytes = array of Byte;
TBUF2 = array[0..1] of Byte;
TBUF3 = array[0..2] of Byte;
TBUF4 = array[0..3] of Byte;
PBUF4 = ^TBUF4;
TBUF6 = array[0..5] of Byte;
TBUF8 = array[0..7] of Byte;
TBUF16 = array[0..15] of Byte;
TUDPRcvRcd = record
Head: TBUF3;
DevType: Byte;
DevID: Byte;
DevIP: TBUF4;
DevMAC: TBUF6;
SoftVer: TBUF2;
HardVer: TBUF2;
DevName: TBUF16;
CHK: Byte;
end;
ReceiveDataEvent = procedure(aData: TIdBytes) of object;
ListRecive = procedure(aData: TIdBytes; aMac: PChar) of object;
ILhm = interface
function SearchDev: Integer; stdcall;
function SetRcvSearchResultProc(aReceiveDataEvent: ReceiveDataEvent): Boolean; stdcall;
function ConnectDev(aMac, aIp, aPort, aPsd: PChar): Boolean; stdcall;
function RemoveDev(aMac: PChar): Boolean; stdcall;
function SendDataByMac(aData: TIdBytes; aMac: PChar): Boolean; stdcall;
function SetRcvDevDataProc(aListRecive: ListRecive): Boolean; stdcall;
end;
function ControllerInit: ILhm; stdcall; external 'controller.dll' name 'ControllerInit';
implementation
end.
나는 지금까지 내 C# 프로젝트에 쓴
내가 잘못 PInvoke를 정의 또는 관한 다양한 오류가 나타납니다[DllImport("controller.dll",
//EntryPoint = "ControllerInt", SetLastError = true,
CallingConvention = CallingConvention.Cdecl)]
public static extern ILhm ControllerInit();
public delegate object ReceiveDataEvent (byte[] aData);
public delegate object ListRecive(byte[] aData, string aMac);
public interface ILhm
{
int SearchDev();
bool SetRcvSearchResultProc(ReceiveDataEvent aReceiveDataEvent);
bool ConnectDev(string aMac, string aIp, string aPort, string aPsd);
bool RemoveDev(string aMac);
bool SendDataByMac(byte[] aData, string aMac);
bool SetRcvDevDataProc(ListRecive aListRecive);
}
:
Additional information: The runtime has encountered a fatal error. The address of the error was at 0x7221dd74, on thread 0x305c. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
을
감사!
파스칼 코드는'Controller.Init'을'stdcall'이라고 부르지 만 C# 코드는'Cdecl'을 사용합니다. 그러나 더 많은 질문이 있습니다. C++ 라이브러리에서 "일반적인"C 함수 또는 C++ 객체를 호출하고 있습니까? C 함수가 작동해야합니다. COM 인터페이스를 내보내는 경우 C++ 객체는 .NET에서만 호출 할 수 있습니다. –