c# - 通过 COM 互操作调用线程

标签 c# com vb6 task com-interop

每当我尝试通过 COM 从 Visual Basic classic 调用 C# 线程时,我都会收到错误消息。错误说泛型类型不能被编码,这很奇怪,因为不涉及泛型。

COM 接口(interface):

[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 似乎不支持任务或者我做错了什么?

最佳答案

[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 代码中创建事件和处理它们

关于c# - 通过 COM 互操作调用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41117520/

相关文章:

delphi - Coinitialize(nil) 和 CoInitializeEx(0, COINIT_MULTITHREADED) 区别

delphi - 如何在我的应用程序中嵌入 Adob​​e Photoshop

vb6 - 从 VB6 调用 C++ DLL 传递垃圾数据作为参数?

c# - 按字母顺序过滤 Active Directory 用户

javascript - 使用 javascript ...cefsharp 从 Form1 (winform c#) 打开 Form2

.net - 从 PHP 页面调用 .net 函数

vb6 - Visual Basic 6 一条语句中的多个变量赋值

c# - 最小起订量错误 : Cannot cast 'AnObject' to 'System.Delegate'

c# - 如何使用XmlDocument在xml中添加处理指令

vb.net - 如何使 SendKeys 在 IBM Host Access Library 中同步 Action