【问题标题】:Calling threads through COM interop通过 COM 互操作调用线程
【发布时间】:2017-04-28 07:16:00
【问题描述】:

每当我尝试通过 COM 从 Visual Basic 经典版调用 C# 线程时都会收到错误消息。错误说不能封送泛型类型,这很奇怪,因为没有涉及泛型。

COM接口:

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

实施:

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

在 Vb6 中调用:

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

我可以创建一个在 C# 中调用线程并通过 COM 公开该方法的方法,但是我确实收到了警告,而且代码看起来一般都很丑陋。有什么方法可以通过 COM 直接调用异步任务,为什么 COM 似乎不支持任务,或者我做错了什么?

【问题讨论】:

  • 您遇到了什么错误?
  • 对不起,我编辑了帖子。 “无法封送泛型类型”异常
  • 好吧,我对 COM 有点生疏了,但由于Task 我怀疑 COM 是否可以返回任务,这似乎是合乎逻辑的。我不确定您通过将方法创建为async 来实现什么,因为据我所知 - COM 在调用时管理您的线程,我怀疑它是否使用了async await 的好处。我会首先尝试创建方法而不返回 Task 或使用 async 并检查它是否有效。
  • 我不太清楚你所说的“我怀疑 COM 可以返回任务”是什么意思,因为据我所知,Task 没有返回语句。
  • 所有 COM 方法都返回一个 HResult。 HResult = Function(InParam1, InParam2, OutParam1) VB 将其更改为类似于 `OutParam = Function(InParam1, InParam2) 的返回值进入错误对象。

标签: c# com vb6 task com-interop


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

上面的代码说你想返回一个Task 对象给COM 代码。 Task 是一个具有属性、方法等的对象,这些属性、方法等表示有关返回 void 的函数的信息。要将任务返回给 COM,它必须是 COM 可见的,并且它的所有成员也需要是 ComVisible 的(我认为)。我不知道是这样。通常你可以看到一个类的 ComVisible 属性,当你去定义它并展开类上方的属性部分时,但在这种情况下我没有。

我不是这方面的专家,但我不相信 ComInterop 也不能使用这样的异步函数。我没有用 COM 做很多多线程,所以我不太确定。

我有一个应用程序,我在其中公开了一个返回 void 的函数,但它在其中调用了一个异步方法。然后,当异步内容完成后,我触发了一个暴露给 COM 的事件,COM 代码将处理它。

Here is a link 关于创建事件并在 COM 代码中处理它们

【讨论】:

  • 整个程序集是 COM 可见的;因此我不必在所有方法上显式声明此属性。感谢您的建议,提出事件我一定会调查的。我目前正在使用 bool 函数来调用异步函数,如果异步函数中发生错误,则返回 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多