Com Interop 발신자에게 C# 열거를 노출 할 수 있습니까? 그렇다면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/1276442

문제

COM Interop을 통해 호출되는 관리 조립품이 있습니다. VBScript 클라이언트, Perl 클라이언트 등과 마찬가지로.

수업은 장식되어 있습니다

[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

물론 나는 정규 일을하고 모든 방법은 잘 작동합니다.

그러나 어셈블리에는 열거 유형도 있습니다. 열거 값에 대해 Symbolic Names COM 응용 프로그램을 사용하고 싶습니다.

COM Interop을 통해 열거를 노출시키는 방법은 무엇입니까? 이 속성을 추가하면됩니다.

[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

그런 다음 VBScript에서 상징적 이름을 어떻게 참조합니까? 나는 Oleview에서 열거 형식을 보지 못한다. (내가해야합니까?) 올레 뷰의 다른 모든 유형을 봅니다.

도움이 되었습니까?

해결책

vbscript 및 기타 후기 클라이언트는 idispatch를 사용하여 객체에서 메소드를 호출합니다. 따라서 이러한 언어는 Typelib에서 유형 정보에 액세스 할 수 없습니다. GUID에서 객체를 작성하고 IDISPATCH 포인터를 다시 가져오고 이름으로 메소드를 호출하기 시작합니다.

나는 질문의 com interop 부분에 대해 확신이 없지만, Enums가 Oleview에 표시 되더라도 직접 사용할 수 없을 것입니다.

그러나 Typelib에 열거를 게시 할 수 있다면 Typelib의 모든 열거를 상수로 포함하는 스크립트 파일 (VBS 또는 JS)을 생성 할 수있는 도구를 작성했습니다.

여기를 봐: http://www.kontrollbehov.com/tools/tlb2const/

다른 팁

내가 Com-Visible을 만든 내 (지금까지) .NET 어셈블리에는 열거 형식이 있었는데,이 유형은 Oleview에서 잘 나타납니다. 나는 전체 라이브러리를 가시적으로 만들었습니다

[ComVisible(true)]

필요하지 않았습니다. 당신의 열거는 공개적입니까?

일어난 한 가지는 다른 열거가 'enum type name'_로 '접두사'되었다는 것입니다.

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

로 전환:

typedef [...]
enum {
    DataType_INT32 = 0,
    DataType_FLOAT64 = 1,
    DataType_INT8 = 2
} DataType;

유형 라이브러리에서.

나는 이것이 아주 오래된 실이라는 것을 알고 있지만, 향후 탐험가들에게 2 센트를 추가 할 것입니다. c#에서 열거를 정의하면 [guid (...), comvisible (true)]로 장식합니다.
예를 들어:

[Guid("28637488-C6B3-44b6-8621-867441284B51"), ComVisible(true)]
public enum myEnum
{
    first,
    second,
    third,
    fourth
}

그런 다음 열거는 VB6에서 myenum_first, myenum_second 등으로 사용할 수 있습니다.

해당 목록에 키 값의 할당을 포함시킬 수 있으므로 첫 번째 = 1은 열거에서 유효합니다.

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