문제

기능이 다음과 같이 정의 된 Delphi DLL이 있습니다.

함수 제출 jobstringlist (joblist : tstringlist; var jobno : integer) : 정수;

나는 이것을 C#에서 호출하고있다. c#에는 tstringlist가 존재하지 않도록 첫 번째 매개 변수를 어떻게 선언합니까? 나는 현재 다음과 같은 선언을 가지고 있습니다.

[DllImport("opt7bja.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int SubmitJobStringList(string[] tStringList, ref int jobno);

그러나 내가 그것을 호출 할 때 나는 메모리 액세스 위반 예외를 얻습니다.

누구든지 C#에서 TStringlist로 올바르게 전달하는 방법을 알고 있습니까?

도움이 되었습니까?

해결책

당신은 이것에 운이 없을 것입니다. TSTRINGLIST는 단순한 배열이 아니라 본격적인 클래스이며 정확한 구현 세부 사항은 .NET의 경우 가능한 내용과 다를 수 있습니다. Delphi VCL 소스 코드 (즉,있는 경우)를 살펴보고 C#에서 클래스를 재건 할 수 있는지 확인하고 가장 친한 친구 인 Interop Marshaller의 도움으로 전달하십시오. 델파이 문자열 유형조차도 .NET 문자열 유형과 다르며 마샬러에게 자신이해야 할 일을 말하지 않고 전달하면 숯으로 전달할 가능성이 높습니다.

그 외에는 Delphi DLL을 변경하는 것이 좋습니다. 델파이가 아닌 클라이언트가 사용하는 DLL에 델파이 특정 모든 것을 노출시키는 것은 결코 좋은 일이 아닙니다. 매개 변수를 PCHA 배열로 만들면 괜찮을 것입니다.

다른 팁

이것이 당신의 DLL이라면, 나는 대신 문자열 배열을 수락하기 위해 함수를 다시 작성합니다. 클래스를 DLL 매개 변수로 전달하지 마십시오.

또는, 당신이 진짜 어떤 이유로 든 tstringlist를 사용하려면 Delphi의 vcl.net은 .NET 언어에서 사용할 수 있습니다.

Tinifile을 사용하는 오래된 예 : http://cc.codegear.com/item/22691

이 예제는 Delphi 2005에서 .NET 1.1을 사용합니다. Delphi 2006 및 2007 지원 .NET 2.0.

DLL을 제어하지 않고 DLL을 변경할 수 없거나 변경하지 않을 경우, 더 친숙한 매개 변수가있는 별도의 DLL에 델파이 래퍼를 항상 쓸 수 있습니다.

클래스를 DLL 기능의 매개 변수로 갖는 것은 실제로 나쁜 형태입니다.

나는 당신의 델파이와 C#을 사용하는 방법을 정확히 명확하지 않습니다. C#에서 호출하려는 Win32 DLL을 만든 것 같습니다. 이를 위해 Pinvoke를 사용해야합니다.

VCL의 완전한 포팅을 사용할 수 있으므로 소스 코드를 사용하여 .NET DLL을 작성하는 것이 좋습니다. 당신이 원한다면 더 자세히 설명 할 수 있습니다 ....

이론적으로, 당신 ~할 수 있었다 강하게 입력 된 객체 참조 대신 포인터를 사용하여 (C# intptr 유형으로 캐스팅) (또는 안전하지 않은 블록을 선언하지 않도록 다른 유형으로 포장)를 사용하여 이와 같은 작업을 수행하지만 필수 캐치는 다음과 같습니다. Delphi 런타임입니다. 객체에 대한 메모리를 할당하고 거래하는 메커니즘이어야합니다. 이를 위해 TSTRINGLIST 클래스의 생성자 및 파괴자를 호출하는 델파이 컴파일 된 DLL에서 기능을 선언해야합니다. Delphi DLL이 Sharemem 장치를 사용해야하는지 확인해야하며 참조 수를 증분하고 감소시키는 데 책임을 져야합니다. DLL을 떠나기 전에 Delphi Ansistrings의 경우, 입력 한 후에는 Delphi DLL에서 내보내는 기능으로도 바람직합니다.

요컨대, 그것은 a입니다 많은 동일한 프로세스 (.NET CLR 및 Delphi의 할당 자)에서 두 명의 메모리 관리자를 저글링해야하기 때문에 작업. 그리고 "바보"델파이 메모리 관리자 및 런타임. 이 설정에 묶인 특별한 이유가 있습니까? 더 높은 수준에서 해결하려는 문제를 설명해 주시겠습니까?

Hemant Jangid가 말했듯이, 코드를 .NET DLL로 컴파일 한 다음 C# 프로젝트에서 해당 어셈블리를 참조하여 쉽게이를 수행 할 수 있어야합니다.

물론 델파이 버전에 delphi.net이있는 경우에만이를 수행 할 수 있습니다.

C#에 대해 많이 알지 못하지만 문맥에서 문자열리스트를 전송하는 데 사용하는 기술은 .text 속성을 사용하여 목록을 나타내는 문자열을 가져온 다음 해당 속성을 "다른 쪽"에 할당하는 것입니다.

벽 위에 끈을 얻는 것이 일반적으로 완전히 날아가는 물체라는 것이 더 쉽습니다.

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