문제

.NET(C#)에 다음을 반환하는 메서드가 있습니다. string[][].RegAsm 또는 TlbExp(.NET 2.0 SDK)를 사용하여 포함 어셈블리에 대한 COM 형식 라이브러리를 만들 때 다음 경고가 표시됩니다.

경고:중첩 배열에 대한 마샬링 지원은 없습니다.

이 경고로 인해 문제의 메서드가 생성된 형식 라이브러리로 내보내지지 않습니다.COM 반환 유형으로 Variant를 사용하고 COM 클라이언트 측에서 캐스팅 등을 사용하는 방법이 있다고 들었습니다.이 특정 어셈블리의 대상 고객은 VB6입니다. 하지만 실제로 .NET 측에서 이 작업을 어떻게 수행합니까?

메모:반환 유형이 Variant인 기존 레거시 DLL(내보낸 유형 라이브러리 포함)이 있지만 이 DLL(및 .tlb)은 .NET 이전 레거시 도구를 사용하여 생성되므로 사용할 수 없습니다.

대신 VB.NET으로 어셈블리를 작성하면 도움이 될까요?

도움이 되었습니까?

해결책

COM Interop의 Variant에 매핑되는 개체를 반환하더라도 문제가 해결되지는 않습니다.VB는 그것을 붙잡고 "전달"할 수 있지만, 그것으로 아무 것도 할 수 없습니다.

기술적으로 VB에는 문자열[][]에 해당하는 것이 없습니다.그러나 배열이 "들쭉날쭉"하지 않은 경우(즉, 모든 하위 배열의 길이가 동일한 경우) 2차원 배열을 반환 유형으로 사용할 수 있습니다.COM Interop은 이를 번역할 수 있어야 합니다.

string [,] myReturnValue = new string[rowCount,colCount];

메소드가 공식적으로 객체(VB에서는 Variant처럼 보임)를 반환하는지, string[,](VB에서는 문자열 배열처럼 보임)을 반환하는지 여부는 다소 중요하지 않습니다.String 배열은 더 나은 결과를 제공하지만 필수 사항은 아닙니다.

배열하면 ~이다 들쭉날쭉하면 다른 방법을 찾아야 할 것입니다.예를 들어, 반환 2D 배열을 가장 큰 하위 배열만큼 크게 만든 다음 별도의 [out] int[] 매개 변수에 길이 정보를 전달하여 VB에서 어떤 요소가 사용되는지 알 수 있습니다.

다른 팁

C#의 변형에 해당하는 것은 System.Object입니다.따라서 결과를 개체로 반환하고 다른 쪽에서 변형으로 다시 가져오는 것이 좋습니다.

VB에는 C#에 부족한 기능이 없으므로 .NET 쪽을 VB로 작성했다면 더 좋거나 쉬울지 의문입니다.

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