2010-04-09 2 views
2

오늘 호기심에 의한 사건이 발생하여 델파이의 객체 모델이 실제로 어떻게 작동하는지 생각하게되었습니다.동일한 클래스가 두 개의 별도 라이브러리에서 호환되지 않습니까?

사건 : 우리는 매개 변수로 객체를 복용 방법 중 몇 가지를 노출하여 SOAP 서비스를 가져온

. 델파이는 SOAP 서비스와 통신하기 위해 사용하는 클래스/인터페이스를 생성하고, 매개 변수로 사용되는 객체는 모두 TRemotable에서 상속합니다.

다른 이유로 우리는 soap 서비스와의 모든 통신을 dll에 넣었습니다.

그런 다음 주 실행 파일에서 보내야하는 객체를 인스턴스화하고 직렬화 및 전송을 위해이를 라이브러리로 전달하려고했습니다.

이제는 작동하지 않았지만 예상치 못한 예외가있었습니다.

우리가 비누 서비스에 보내려고하는 대상은 TRemotable에서 상속해야한다고 말했지만 실제로는 그렇습니다. 객체를 검사하면 클래스가 wsdl에서 가져온 클래스이고 부모 클래스가 참으로 TRemotable임을 알 수 있습니다.

패키지로 빌드하면이 문제가 해결됩니다.

질문 : 두 라이브러리 사이에 공유 소스 파일에 정의 된 클래스는 런타임에 서로 다른 클래스를 끝나도록

가 있습니까? 그렇다면 그 이유는 무엇입니까?

내가 아는 한, 라이브러리간에 객체를 전달하는 것이 좋습니다. 그렇다면 강력한 타이핑이 어떻게 보장되고, 객체 인스턴스가 어느 정도 서로 호환 될 수 있을까요?

답변

3

예, 다른 DLL의 동일한 클래스가 다릅니다. 각 DLL의 클래스는 런타임에로드되고 다른 메모리를 가리키므로 동일한 소스 파일의 경우에도 A.ClassType = B.ClassType이 실패합니다. 당신은 여전히 ​​객체를 전달할 수 있으며 클래스 자체를 비교하기 위해 "is"또는 "as"를 사용하는 경우를 제외하고는 제대로 작동합니다. 강력한 타이핑은 DLL 및 주 응용 프로그램을 컴파일 할 때 클래스가 일치한다고 컴파일러에서 가정한다는 점에서만 보장됩니다. 한 버전의 객체와 수정 된 객체 선언을 사용하려는 새로운 응용 프로그램에서 DLL을로드하는 것을 막을 수는 없습니다. 원하는 경우 패키지를 사용해야합니다.

+0

확인. 이것은 제가 추측 한 것에 대한 확인입니다. 사실, 우리가 더 나은 디자인을 강요하기 때문에 나는 이것을 좋아합니다 ... – Vegar

0

매개 변수를 TObject로 전달하고 양쪽에서 TRemotable로 캐스팅 할 수 있습니다. 나는이 특별한 경우를 시도하지 않았지만, 나는 TObject를 DLL과 같이 통과시켰다. 또한 SOAP과 비슷한 DLL을 가지고 있는데 제 경우 SOAP DLL이 D2007 SOAP 라이브러리로 컴파일되고 복잡한/레거시 이유로 컴파일되지 않습니다. 나머지 응용 프로그램은 D2005입니다.

관련 문제