每当我尝试通过 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/