小编Edu*_*ner的帖子

将C#数组的COM对象传递给VB6

我正在尝试将.NET数组传递给COM VB6库.我有一个对象是VB6对象的COM包装器.它具有以下签名的方法:

[MethodImpl(MethodImplOptions.InternalCall, 
    MethodCodeType = MethodCodeType.Runtime)]
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems);
Run Code Online (Sandbox Code Playgroud)

但是当我打电话给它时,我收到ArgumentException以下消息:

价值不在预期范围内.

异常的类型及其描述甚至不依赖于传递的元素.

有人知道如何解决这个问题吗?

UPD:我删除了.NET包装器程序集和引用的源.COM库.没有发生任何变化.

c# arrays vb6 com marshalling

6
推荐指数
1
解决办法
1007
查看次数

了解MassTransit中的SubscribtionEndpoint和RecieveEndpoint

我试图与Azure Service Bus一起了解MassTransit配置。

在配置时,有2种重载方法:SubscriptionEndpoint<T>RecieveEndpoint。我如何理解与MT和ASB进行消息传递的方式。

有两种消息:事件和命令。事件通过Publish<T>方法发布并传递到主题。它们可以被许多不同的应用程序使用。命令通过Send<T>方法发送并传递到队列。来自队列的消息仅消耗一次(例如,并发阅读器)。

因此,我认为SubscribtionEndpoint代表事件的配置,因此它具有<T>通过类型约定进行路由的功能,并且RecieveEndpoint用于连接命令发送者和命令处理程序。

但是我的测试应用程序说,无论我使用SubscribtionEndpoint还是RecieveEndpoint,无论天气如何,我仍然可以接收事件。

让我们考虑示例:

cfg.ReceiveEndpoint(host, queueName: "AnotherSubscirber2", configure: configurator =>
{
    configurator.Handler<ObjectCreatedB>(context =>
    {
        Console.WriteLine("Another subscirber, object b created");
        return Task.CompletedTask;
    });
});
Run Code Online (Sandbox Code Playgroud)

第二个参数的名称为queueName,但用作主题的订户名称。当我使用发布事件时publishEndpoint.Publish<ObjectCreatedB>,我可以处理此消息。因此,MT创建了有关以下主题的订阅:

在此处输入图片说明

它怎么知道需要倾听ObjectCreatedB呢?队列名称为,AnotherSubscirber2但MT创建了订阅AnotherSubscirber2。参数命名正确吗?

如果添加此代码,我仍将完成相同操作:

cfg.SubscriptionEndpoint<ObjectCreatedB>(host, subsriberName, configurator =>
{
    configurator.Consumer<ObjectBCreatedEventHandler>();
});
Run Code Online (Sandbox Code Playgroud)

那有什么区别 我该如何注册命令处理程序而不是事件处理程序呢?还是我错过了什么?我的示例代码在这里

提前致谢!

masstransit

5
推荐指数
0
解决办法
176
查看次数

标签 统计

arrays ×1

c# ×1

com ×1

marshalling ×1

masstransit ×1

vb6 ×1