2016-12-13 5 views
2

Visual Basic에서 COM을 통해 C# 스레드를 호출하려고하면 오류가 발생합니다. 오류는 제네릭 형식이 포함되어 있지 않으므로 제네릭 형식을 마샬링 할 수 없다는 사실은 이상합니다.COM interop을 통한 스레드 호출

COM 인터페이스 :

[Guid("C8B306A5-980D-4226-8130-5E2E0F710FC2")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface comInterface 
{ 
    [DispId(1)] 
    Task firstTask(); 
} 

구현 : VB6에서

[Guid("0D5E5234-B1C0-4CFA-9B35-21F091E2E8C4")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("COMproject.implementClass")] 
public class implementClass : comInterface{ 
public async Task firstTask(){ 
//doSomething 
} 

전화 : 난 그냥 C#에서 스레드를 호출하는 방법을 생성하는 방법을 노출시킬 수

Dim comObject As muhDLL.comInterface 
Set comObject = New muhDLL.implementClass 
comObject.firstTask 

하지만 COM을 통해 경고를 받으면 코드는 일반적으로보기 흉하게 보입니다. COM을 통해 비동기 작업을 직접 호출 할 수있는 방법이 있습니까? COM이 작업을 지원하지 않는 것처럼 보이는 이유는 무엇입니까?

+1

무엇이 오류입니까? – gilmishal

+0

죄송합니다. 게시물을 편집했습니다. "일반 형식을 마샬링 할 수 없습니다."예외 – MrKey

+0

그래, COM과 약간 녹슬었지만 COM이 Task를 반환 할 수 있을지 의심 스럽기 때문에 'Task'때문이라는 것이 논리적 인 것처럼 보입니다. 나는 당신이'async' 메소드를 생성함으로써 달성하고자하는 것을 확신하지 못한다. 왜냐하면 내가 아는 한 COM은 호출 할 때 스레드를 관리하기 때문에,'async await'의 이점을 사용하는 것이 의심 스럽다. 먼저 Task를 반환하지 않고 비동기를 사용하고 작동하는지 확인하지 않고 메서드를 만들려고합니다. – gilmishal

답변

0
[Guid("C8B306A5-980D-4226-8130-5E2E0F710FC2")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface comInterface 
{ 
    [DispId(1)] 
    Task firstTask(); 
} 

위의 코드는 COM 코드에 Task 개체를 반환하려는 말한다. Task는 void를 반환하는 함수에 대한 정보를 나타내는 속성, 메서드 등이있는 객체입니다. 작업을 COM으로 반환하려면 COM으로 표시되어야하며 모든 구성원도 ComVisible이어야합니다 (필자는 생각합니다). 나도 몰라. 일반적으로 클래스의 ComVisible 속성을 볼 수 있으며 클래스의 속성 섹션을 확장하지만이 경우에는 정의되지 않습니다.

저는 전문가는 아니지만 ComInterop이 비동기 기능을 가지고 작동한다고 생각하지 않습니다. COM에서 멀티 스레딩을 많이하지 않았으므로 완전히 확신 할 수는 없습니다.

나는 void를 반환하는 함수를 노출하는 응용 프로그램을 가지고 있지만 그 안에 비동기 메서드를 호출했습니다. 그런 다음 비동기 작업이 끝나면 COM에 노출 된 이벤트를 발생시키고 COM 코드가이를 처리합니다.

Here is a link 이벤트를 생성하고 COM 코드로 처리하는 경우

+0

전체 어셈블리가 COM으로 표시됩니다. 따라서 모든 메서드에서이 특성을 명시 적으로 선언 할 필요가 없습니다. 의견을 보내 주셔서 감사 드리며, 분명히 살펴 보겠습니다. 나는 현재 async 함수를 호출하기 위해 bool 함수를 사용하고 있는데, async 함수에서 에러가 발생하면 false를 리턴한다. – MrKey