繁体   English   中英

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

[英]Runtime error 438. Object doesn't support this property or method

我正在尝试使用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。对象不支持此属性或方法。 我检查了其他答案,但无法得到我的问题的答案。

consume是静态方法,COM不支持任何仅支持实例方法和属性的静态方法。 从您的代码中删除static

您正在使用的方法还将始终返回一个空字符串。 您是在任务中说明您的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进行编辑。)

第三,由于consumpt()是静态方法,因此为什么仍要创建netConsumer?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM