运行时错误438.对象不支持此属性或方法

本文关键字:属性 方法 不支持 对象 运行时错误 | 更新日期: 2023-09-27 18:06:04

我试图使用c# tlb作为参考,然后在VBA中使用该代码。VBA代码看起来像这样:

Sub startConsumer()
    Dim Consumer As Consumer.netConsumer
    Set Consumer = New Consumer.netConsumer
    MsgBox (Consumer.consume())
End Sub

原始的c#代码是这样的:

namespace netConsumer
{ 
    public class netConsumer
    {
        public static string message;
        public static KafkaOptions options = new KafkaOptions(new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"))
        {
            Log = new ConsoleLog()
        };
        public static BrokerRouter router = new BrokerRouter(options);
        public static string consume()
        {
            Task.Factory.StartNew(() =>
            {

                var consumer = new Consumer(new ConsumerOptions("TestHarness3", router));
                foreach (var data in consumer.Consume())
                {
                    Console.WriteLine("Response: P{0},O{1} : {2}", data.Meta.PartitionId, data.Meta.Offset, data.Value);
                    var utf8 = Encoding.UTF8;
                    message += utf8.GetString(data.Value, 0, data.Value.Length);
                    ExcelWorksheet.writeToExcel(message);
                }
          });

            return message;
        } 

    }
}

早些时候它是工作的,但现在我得到运行时错误438。对象不支持此属性或方法。我检查了其他答案,也没有得到我的问题的答案。

运行时错误438.对象不支持此属性或方法

consume是一个静态方法,COM不支持任何静态方法,只支持实例方法和属性。从你的代码中去掉static

你的consume方法也总是返回一个空字符串。您在任务中声明您的Consumer,但您没有等待该任务完成。您要么需要摆脱Task并同步运行Consumer,要么将event添加到netConsumer类并在任务完成时引发该事件。

同步方式:

public class netConsumer
{
    public string message;
    public KafkaOptions options = new KafkaOptions(new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"))
    {
        Log = new ConsoleLog()
    };
    public BrokerRouter router = new BrokerRouter(options);
    public string consume()
    {
        var consumer = new Consumer(new ConsumerOptions("TestHarness3", router));
        foreach (var data in consumer.Consume())
        {
            Console.WriteLine("Response: P{0},O{1} : {2}", data.Meta.PartitionId, data.Meta.Offset, data.Value);
            var utf8 = Encoding.UTF8;
            message += utf8.GetString(data.Value, 0, data.Value.Length);
            ExcelWorksheet.writeToExcel(message);
        }
        return message;
    }
}

异步事件:

public delegate void ConsumeCompleteHandler(string message);
public class netConsumer
{
    public string message;
    public KafkaOptions options = new KafkaOptions(new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"), new Uri("http://rqdsn0c.bnymellon.net:9092"))
    {
        Log = new ConsoleLog()
    };
    public BrokerRouter router = new BrokerRouter(options);
    public void consume()
    {
        Task.Factory.StartNew(() =>
        {

            var consumer = new Consumer(new ConsumerOptions("TestHarness3", router));
            foreach (var data in consumer.Consume())
            {
                Console.WriteLine("Response: P{0},O{1} : {2}", data.Meta.PartitionId, data.Meta.Offset, data.Value);
                var utf8 = Encoding.UTF8;
                message += utf8.GetString(data.Value, 0, data.Value.Length);
                ExcelWorksheet.writeToExcel(message);
            }
            OnConsumeComplete(message);
        });
    }
    public event ConsumeCompleteHandler ConsumeComplete;
    protected virtual void OnConsumeComplete(string message)
    {
        var handler = ConsumeComplete;
        if (handler != null) handler(message);
    }
}

几件事。在VBA代码中,消费者意味着两件事(netConsumer的变量和容器);这至少会引起混淆。

外部消费者到底是什么?(不是变量的那个。)从c#代码来看,它应该是netConsumer。如何将类导出到COM呢?(关于命名空间和类名的错误内容按照下面的shf301编辑掉了)

第三,既然consume()是一个静态方法,为什么要创建一个netConsumer呢?