문제

COM Interop을 통해 ASP가 소비 할 .NET 어셈블리의 부서 모음을 반환하려고합니다. .NET를 사용하여 일반 컬렉션을 반환합니다. List<Department>, 그러나 제네릭은 COM Interop과 잘 작동하지 않는 것 같습니다. 그래서 내 옵션은 무엇입니까?

나는 목록을 반복하고 색인별로 항목에 액세스 할 수 있기를 원합니다. 내가 상속해야합니다 List<Department>, 구현 IList, IList<Department> 아니면 다른 인터페이스, 아니면 더 좋은 방법이 있습니까? 이상적으로는 필요한 모든 유형의 목록에 대해 사용자 정의 컬렉션을 구현하지 않아도됩니다. 또한, 의지 List[index] COM Interop과 함께 일합니까?

고마워요, 마이크

예 .NET 구성 요소 (C#) :

public class Department {
    public string Code { get; private set; }
    public string Name { get; private set; }
    // ...
}

public class MyLibrary {
    public List<Department> GetDepartments() {
        // return a list of Departments from the database
    }
}

예제 ASP 코드 :

<%
Function PrintDepartments(departments)
    Dim department
    For Each department In departments
        Response.Write(department.Code & ": " & department.Name & "<br />")
    Next
End Function

Dim myLibrary, departments
Set myLibrary = Server.CreateObject("MyAssembly.MyLibrary")
Set departments = myLibrary.GetDepartments()
%>
<h1>Departments</h1>
<% Call PrintDepartments(departments) %>
<h1>The third department</h1>
<%= departments(2).Name %>

관련 질문 :

도움이 되었습니까?

해결책

더 많은 연구와 시험과 반사 후, 나는 사용하여 해결책을 찾았다 고 생각합니다. System.Collections.ArrayList. 그러나 이것은 인덱스별로 값을 얻는 데 작동하지 않습니다. 그렇게하기 위해 새로운 수업을 만들었습니다 ComArrayList 그게 상속됩니다 ArrayList 새로운 방법을 추가합니다 GetByIndex 그리고 SetByIndex.

Com Interop 호환 컬렉션 :

public class ComArrayList : System.Collections.ArrayList {
    public virtual object GetByIndex(int index) {
        return base[index];
    }

    public virtual void SetByIndex(int index, object value) {
        base[index] = value;
    }
}

업데이트 된 .NET 구성 요소 MyLibrary.getDepartments :

public ComArrayList GetDepartments() {
    // return a list of Departments from the database
}

업데이트 된 ASP :

<h1>The third department</h1>
<%= departments.GetByIndex(2).Name %>

다른 팁

ASP에서 데이터 만 소비하므로 반환하는 것이 좋습니다. Department[]. 이것은 com의 Safearray에 직접 매핑되어야합니다. 열거 및 색인 액세스도 지원합니다.

public Department[] GetDepartments() {
    var departments = new List<Department>();
    // populate list from database
    return departments.ToArray();
}

ASP 코드 에서이 작업을 수행 할 수 없습니까?

<h1>The third department</h1>
<%= departments.Item(2).Name %>

VB .NET에서 C# 인덱서는 "항목"속성을 통해 지원되므로 ASP에서 동일한 아이디어가 작동 할 수 있습니다.

VB.NET 에서이 같은 문제를 해결하려고 노력했습니다 (C#에서 유창하지 않음).

목록 (t)은 ILIST 인터페이스를 지원하기 때문에 내 객체의 COM 인터페이스에 대한 ILIST 인터페이스를 지원합니다.

Public Class MyClass
...
   Private _MyList As List(of MyObject)
   Public ReadOnly Property MyList As IList Implements IMyClass.MyList
    Get
        Return _MyList
    End Get
   End Property

그런 다음 com이 보는 공개 인터페이스에 지정

ReadOnly Property MyList As IList

이것은 객체를 인스턴스화하고 발전기 기능을 호출 한 다음 배열처럼 MyList 속성을 읽는 클래식 ASP 클라이언트에서 잘 작동하는 것 같습니다.

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