【问题标题】:Runtime error 438. Object doesn't support this property or method运行时错误 438。对象不支持此属性或方法
【发布时间】:2015-10-25 21:38:21
【问题描述】:

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

【问题讨论】:

  • 在我看来不像 C...

标签: c#


【解决方案1】:

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

外部消费者到底是什么? (不是变量的那个。)从 C# 代码看起来应该是 netConsumer。无论如何,您如何将课程导出到 COM? (根据下面的 shf301 编辑了有关命名空间和类名的错误内容。)

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

【讨论】:

  • 您被“允许”拥有一个与其命名空间同名的类,因为它是有效的 C# 代码。不推荐,因为会造成很大的悲痛:stackoverflow.com/questions/18731415/…
  • @shf301 - 我确定我这样做有错误,但似乎没有。谢谢!我会编辑答案。
  • 是的,静态方法是问题所在。外部消费者是我作为参考添加的 tlb 文件的名称。我试图更改它,但它导致错误,所以我离开了它。
【解决方案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);
    }
}

【讨论】:

  • 是的,静态方法是问题所在。外部消费者是我作为参考添加的 tlb 文件的名称。我试图更改它,但它导致错误,所以我离开了它。
  • 我会试试你的方法,谢谢
  • @QWERTYP5391 如果这解决了您的问题,您应该将其标记为答案。我看到相同的运行时错误并从我的方法中删除 static 解决了它 - 谢谢 shf301
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多