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

时间:2015-08-03 17:15:30

标签: c#

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

2 个答案:

答案 0 :(得分:2)

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);
    }
}

答案 1 :(得分:0)

一些事情。在VBA代码中,Consumer意味着两件事(netConsumer的变量和容器);这至少会引起混淆。

无论如何,外部消费者是什么? (那个不是变量的那个。)它从C#代码看起来应该是netConsumer。你怎么样把这个类导出到COM呢? (关于命名空间和类名的错误内容按照下面的shf301编辑出来。)

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